【发布时间】:2019-08-21 21:51:19
【问题描述】:
更新:C++ 程序(如下所示)在编译时没有附加标志,即g++ program.cpp。然而,提高优化级别并不能改变蛮力比记忆技术运行得更快的事实(0.1 秒 VS 1 秒在我的机器上)。
上下文
我尝试计算Collatz sequence 最长的数字(
我的问题是:蛮力执行速度比 C++ 中所谓的优化(记忆)版本更快的原因可能是什么?
在我的机器(Macbook Air)上的比较之下;时间在 cmets 程序代码的开头。
C++(蛮力)
/**
* runs in 1 second
*/
#include <iostream>
#include <vector>
unsigned long long nextSequence(unsigned long long n)
{
if (n % 2 == 0)
return n / 2;
else
{
return 3 * n + 1;
}
}
int main()
{
int max_counter = 0;
unsigned long long result;
for (size_t i = 1; i < 1000000; i++)
{
int counter = 1;
unsigned long long n = i;
while (n != 1)
{
n = nextSequence(n);
counter++;
}
if (counter > max_counter)
{
max_counter = counter;
result = i;
}
}
std::cout << result << " has " << max_counter << " sequences." << std::endl;
return 0;
}
C++(记忆)
/**
* runs in 2-3 seconds
*/
#include <iostream>
#include <unordered_map>
int countSequence(uint64_t n, std::unordered_map<uint64_t, uint64_t> &cache)
{
if (cache.count(n) == 1)
return cache[n];
if (n % 2 == 0)
cache[n] = 1 + countSequence(n / 2, cache);
else
cache[n] = 2 + countSequence((3 * n + 1) / 2, cache);
return cache[n];
}
int main()
{
uint64_t max_counter = 0;
uint64_t result;
std::unordered_map<uint64_t, uint64_t> cache;
cache[1] = 1;
for (uint64_t i = 500000; i < 1000000; i++)
{
if (countSequence(i, cache) > max_counter)
{
max_counter = countSequence(i, cache);
result = i;
}
}
std::cout << result << std::endl;
return 0;
}
在 Python 中,记忆技术确实运行得更快。
Python(记忆)
# runs in 1.5 seconds
def countChain(n):
if n in values:
return values[n]
if n % 2 == 0:
values[n] = 1 + countChain(n / 2)
else:
values[n] = 2 + countChain((3 * n + 1) / 2)
return values[n]
values = {1: 1}
longest_chain = 0
answer = -1
for number in range(500000, 1000000):
if countChain(number) > longest_chain:
longest_chain = countChain(number)
answer = number
print(answer)
Python(蛮力)
# runs in 30 seconds
def countChain(n):
if n == 1:
return 1
if n % 2 == 0:
return 1 + countChain(n / 2)
return 2 + countChain((3 * n + 1) / 2)
longest_chain = 0
answer = -1
for number in range(1, 1000000):
temp = countChain(number)
if temp > longest_chain:
longest_chain = temp
answer = number
print(answer)
【问题讨论】:
-
c++ 版本的所有优化器设置都打开了吗?
-
不,我不这么认为。刚刚使用
g++ program.cpp编译 - 同时我会尝试设置最高优化级别。 -
@Ely -- 所有关于 C++ 程序与语言 X 相比的速度或为什么一个版本的程序运行速度比另一个版本快的所有问题都应附有用于编译 C++ 应用程序的优化设置.否则显示的所有时间信息都变得毫无意义。
-
unordered_map 执行大量动态内存分配,与基于 CPU 的原始处理相比,这会带来重大损失。
-
@Ely 另请注意,您可以使用
gprof来分析您的代码并检测实际的瓶颈。
标签: python c++ algorithm performance execution-time