性能从 'int' 显著降低到 'long int'
Significant performance decrease from 'int' to 'long int'
我已经编写了埃拉托色尼筛子的简单实现,用于计算给定范围内的素数。最初我计划使用 long int
作为主整数类型。计算小于 10 milion 的所有素数需要 11-12 秒。但是当我将类型切换到 int
时,我得到了大约 4-5 秒。因此我想知道 - 为什么?
我知道long int
比int
占用更多的空间,但我运行的是 64 位 CPU - 所以 - 如果我理解正确 - 它具有接受 64 位整数的 ALU,即此类数字的指令可以在相同数量的周期内执行。我之前的研究揭示了类似的问题,询问了unsigned
和signed
类型之间的性能差异([这里][1]或[这里][2]),但我使用的是signed
变量,我仍然得到相同(小于 2^33-1)输入的性能下降。下面我发布我的完整代码。
#include <iostream>
#include <fstream>
int main()
{
unsigned long int X, i, j;
bool *prime, *primeFill;
std::fstream outFile;
clock_t T;
/* user interaction */
std::cout << "This applet will export all prime number from range (0, X). Enter desired X value: ";
std::cin >> X;
primeFill=new bool [X];
for (i=2; i<X; i++)
primeFill[i]=false;
prime = new bool [X];
/* main loop, where all actual computation happens */
T=clock(); i=2;
while(i<X) {
prime[i]=true, primeFill[i]=true;
for (j=2*i; j<=X; j+=i) prime[j]=false, primeFill[j]=true;
while (primeFill[i])
i++;
}
T=clock()-T;
/* outputing results to textfile & standard output */
outFile.open("primes.txt", std::ios::out);
for (i=2; i<X; i++)
if (prime[i])
outFile << i << 'n';
outFile.close();
std::cout << "Finished. Computation took " << (1000*float(T)) / CLOCKS_PER_SEC << " msn";
return 0;
}
编辑上面的新代码不会产生这样的问题。请参考下面的回答。
正如@LogicStuff正确指出的那样,我通过使用isPrime()
函数错过了埃拉托色尼筛子的重点。我已经编辑了代码(编辑了原始问题),现在相同的测试(计算小于 10 milion 的素数)需要 250 到 300 毫秒,尽管是整数类型 - 我已经测试了int
、long int
、unsigned int
和unsigned long int
。
这意味着问题的根源在于isPrime()
函数内部,即编译器或CPU缺乏double
转换或%
运算符的优化。我打赌第一个,因为正如我在最初的帖子中提到的那样,这里已经描述了这个问题unsigned int
。感谢所有评论。
相关文章:
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 错误:隐式转换更改符号:'int'到'unsigned long'
- 对 '(const Y) (int&, std::mersenne_twister_engine<long unsigned int,
- 自动类型默认为 int 而不是 long
- 错误:'class std::unique_ptr<std::set<long unsigned int> >'没有名为 'size' 的成员
- "1L << count"是什么意思?如何使用超出"unsigned long long int? "范围的语句编号打印?
- Visual studio 2013 和 g++ 7.1 中将 int 和 long 类型相乘时的 c++ 差异行为
- 错误:调用'begin(long double [nPoints])'没有匹配函数;使用硬编码的 int 与整数变量初始化向量
- 只读位置'__result.std::_Rb_tree_const_iterator<_Tp>::operator*<long long int>()'分配错误
- C++ vector::size_type:有符号与无符号;int vs. long
- 错误:将"long int (*)[4]"分配给"long int [4][4]"时的类型不兼容
- 没有匹配函数来调用"std::basic_ofstream<char>::write(std::string*, long long unsigned int)"
- 函数参数可以是char*、long或int.可能吗
- unsigned int/signed int/long-long:无法解释的输出
- 如何在C++中将二进制文件上下文转换为 int/long 值
- <int> <long> 当它们的大小相同时,将矢量转换为矢量?
- " long unsigned typedef int long ullong; "是什么意思?
- 我如何使用3个重载函数(参数的差异是int, long, float)同时只要求一个输入项
- 使用非固定整数(int, long)而不是固定大小的整数(int64_t, int32_t)有什么优势吗?