Tag: 性能

关于如何使我的算法更快的建议

这是我在C中的代码来自项目-Euler的问题#3,在那里我必须找到最大的素数因子600851475143。 #include #include bool is_prime(long int number){ long int j; for (j=2; j1; factor–){ if (input%factor==0 && is_prime(factor)) { ans = factor; break; } } printf(“%d\n”, ans); system(“pause”); return 0; } 虽然它适用于小数字,但逐渐需要花费越来越多的时间来给出答案。 最后,对于600851475143,代码返回0,这显然是错误的。 有人可以帮忙吗? 非常感谢。

哪个运算符更快(>或> =),(<或<=)?

<更便宜(更快)而不是<= ,同样地, >比>=更便宜(更快)? 免责声明:我知道我可以测量,但这只会在我的机器上,我不确定答案是否可以是“特定于实现”或类似的东西。

如何在x86-64上优化C和C ++中的函数返回值?

x86-64 ABI指定两个返回寄存器: rax和rdx ,大小均为64位(8字节)。 假设x86-64是唯一的目标平台,这两个function中的哪一个: uint64_t f(uint64_t * const secondReturnValue) { /* Calculate a and b. */ *secondReturnValue = b; return a; } std::pair g() { /* Calculate a and b, same as in f() above. */ return { a, b }; } 考虑到针对x86-64的C / C ++编译器的当前状态,会产生更好的性能吗? 使用一个版本或其他版本在性能方面是否有任何陷阱? 编译器(GCC,Clang)总是能够优化在rax和rdx返回的std::pair吗? 更新:通常,如果编译器优化了std::pair方法(使用GCC 5.3.0和Clang 3.8.0的二进制输出示例),则返回一对更快。 如果没有内联f() ,编译器必须生成代码以将值写入内存,例如: movq […]

strlen性能实现

这是一个多function问题: 这与glibc strlen实现相比如何? 有没有更好的方法来实现这一点和自动向量化。 随机填充垃圾,因为stackoverflow以某种方式比我更了解代码到汇总比率 #include #include #include #include #include #include /* Todo: Document */ #define WORD_ONES_LOW ((size_t)-1 / UCHAR_MAX) #define WORD_ONES_HIGH (((size_t)-1 / UCHAR_MAX) << (CHAR_BIT – 1)) /*@doc * @desc: see if an arch word has a zero * #param: w – string aligned to word size */ static inline bool word_has_zero(const size_t […]

基数排序优化

我试图优化Radix排序代码,因为我觉得它有空间,因为书籍和网络上的传统代码似乎是彼此的直接副本,而且它们的工作速度很慢,因为它们采用任意数字,例如10为模数操作。 我尽可能地优化了代码,也许我可能错过了一些优化技术。 在那种情况下请赐教。 优化动机: http://codercorner.com/RadixSortRevisited.htm http://stereopsis.com/radix.html 我无法在文章中实现所有优化,主要是超出我的技能和理解,缺乏足够的时间,如果你可以随意实现它们。 编辑4 这个Java版本的Radix Sort在1次读取中计算所有直方图,并且不需要在每次LSB排序后用零填充数组Z以及通常的跳过排序和跳转到下一个LSB​​排序的能力(如果所有先前的LSB都相同)。 像往常一样,这仅适用于32位整数,但可以从中创建64位版本。 protected static int[] DSC(int A[])// Sorts in descending order { int tmp[] = new int[A.length] ; int Z[] = new int[1024] ; int i, Jump, Jump2, Jump3, Jump4, swap[] ; Jump = A[0] & 255 ; Z[Jump] = 1 ; Jump2 = ((A[0] >> […]

仅使用恒定移位来模拟可变位移?

我试图找到一种方法来执行间接左移/右移操作而不实际使用变量移位操作或任何分支。 我正在研究的特定PowerPC处理器有一个怪癖,即按常数立即移位,就像 int ShiftByConstant( int x ) { return x << 3 ; } 是快速的,单操作的,超标量的,而变量的变换,如 int ShiftByVar( int x, int y ) { return x << y ; } 是一个微编码操作,需要7-11个周期才能执行,而管道的其余部分都停止运行 。 我想做的是找出哪些非微码整数PPC操作sraw解码然后单独发出它们。 这对于sraw本身的延迟没有帮助 – 它将用6替换一个op – 但是在这六个操作之间我可以将一些工作双重调度到其他执行单元并获得净增益。 我似乎无法找到μopssraw解码到的任何地方 – 有没有人知道如何用一系列常量移位和基本整数运算替换变量位移? (for循环或开关或其中带有分支的任何东西都不起作用,因为分支惩罚甚至比微码惩罚更大。) 这不需要在assembly中回答; 我希望学习算法而不是特定的代码,所以用C语言或高级语言甚至伪代码的答案都会非常有用。 编辑:我应该补充一些说明: 我甚至不担心可移植性 PPC具有条件移动,因此我们可以假设存在无分支内部函数 int isel(a,b,c){return a> = 0? b:c; } (如果你写出一个做同样事情的三元组,我会明白你的意思) 整数乘法也是微编码的,甚至比sraw慢。 […]

C:与NULL的比较

除了宗教论点: 选项1: if (pointer[i] == NULL) … 选项2: if (!pointer[i]) … 在C中,option1在function上等同于option2? 由于没有比较,后者解决得更快吗?

为什么汇编需要这么长时间?

我正在设计一种编程语言,我想到的问题之一就是为什么编程语言需要很长时间才能编译。 假设c ++需要很长时间,因为它需要在每次编译文件时解析并编译头文件。 但是i -heard-预编译的头文件需要多长时间? 我怀疑c ++不是唯一有这个问题的语言。

printf减慢了我的程序

我有一个小的C程序来计算哈希值(哈希表)。 我希望代码看起来很干净,但有一些与之无关的东西让我烦恼。 我可以在大约0.2-0.3秒内轻松生成大约一百万个哈希值(以/ usr / bin / time为基准)。 但是,当我在for循环中使用printf()时,程序会减慢到大约5秒钟。 为什么是这样? 如何让它更快? mmapp()ing stdout也许? stdlibc是如何设计的,以及如何改进? 内核怎么能更好地支持它? 如何修改本地“文件”(套接字,管道等)的吞吐量真的很快? 我期待着有趣而详细的回复。 谢谢。 PS:这是一个编译器构造工具集,所以不要害羞进入细节。 虽然这与问题本身无关,但我只想指出细节让我感兴趣。 附录 我正在寻找更多解决方案和解释的程序方法。 确实,管道工作起了作用,但我无法控制“用户”的作用。 当然,我现在正在进行测试,“普通用户”不会这样做。 但是,这并没有改变一个简单的printf()减慢进程的事实,这是我试图找到最佳编程解决方案的问题。 附录 – 令人惊讶的结果 参考时间用于TTY内的普通printf()调用,大约需要4分20秒。 在/ dev / pts(例如Konsole)下进行测试可将输出速度提高到约5秒。 在我的测试代码中使用setbuffer()大小为16384时需要大约相同的时间,对于8192几乎相同:大约6秒。 setbuffer()在使用它时显然没有效果:它需要相同的时间(在TTY上大约4分钟,在PTS上大约5秒)。 令人惊讶的是 ,如果我在TTY1上开始测试然后切换到另一个TTY ,它确实与PTS上的相同:大约5秒。 结论 :内核做了一些与可访问性和用户友好性有关的事情。 呵呵! 通常情况下,无论您在活动时盯着TTY,还是切换到另一个TTY,它都应该同样慢。 课程 :运行输出密集型程序时,切换到另一个TTY!

是否更快地访问堆中的数据?

我知道这听起来像是一个普遍的问题而且我已经看过很多类似的问题(无论是在这里还是在网上),但它们都不是我的困境。 说我有这个代码: void GetSomeData(char* buffer) { // put some data in buffer } int main() { char buffer[1024]; while(1) { GetSomeData(buffer); // do something with the data } return 0; } 如果我在全局声明缓冲区[1024],我会获得任何性能吗? 我通过time命令在unix上运行了一些测试,执行时间之间几乎没有差异。 但我真的不相信…… 理论上,这种变化应该有所作为吗?