我正在阅读这个分支,错误预测可能是应用程序性能的一个热点瓶颈。 正如我所看到的,人们通常会显示汇编代码,揭示了这个问题,并指出程序员通常可以预测分支可以走多远的时间,避免分支错误预测。 我的问题是: 1-是否可以避免使用一些高级编程技术(即没有汇编 )的分支预测错误? 2-我应该记住用高级编程语言(我主要对C和C ++感兴趣)生成支持分支的代码? 代码示例和基准值得欢迎!
我刚刚阅读了关于分支预测的内容 ,想试试Java 8 Streams如何工作。 然而Streams的performance总是比传统的循环更糟糕。 int totalSize = 32768; int filterValue = 1280; int[] array = new int[totalSize]; Random rnd = new Random(0); int loopCount = 10000; for (int i = 0; i < totalSize; i++) { // array[i] = rnd.nextInt() % 2560; // Unsorted Data array[i] = i; // Sorted Data } long start […]
在这个代码中: if (value >= x && value <= y) { 当value >= x和value <= y情况下, 如果没有特定的模式可能是真的, 那么使用&运算符会比使用&&更快吗? 具体来说,我正在思考如何&&懒惰地评估右侧expression式(即只有当LHS是真实的),这意味着一个条件,而在Java &在这方面保证严格评估两个(布尔)子expression式。 价值结果是相同的任何方式。 但是,当>=或<=运算符将使用一个简单的比较指令时, &&必须包含一个分支,并且该分支容易出现分支预测失败 – 按照这个非常着名的问题: 为什么处理sorting数组的速度比一个未分类的数组? 因此,强迫expression没有懒惰的组件肯定会更确定,不容易被预测失败。 对? 笔记: 显然,如果代码如下所示,我的问题的答案是否定的: if(value >= x && verySlowFunction()) 。 我正在关注“足够简单”的RHSexpression式。 那里有一个条件分支( if语句)。 我无法向自己certificate这是无关紧要的,而替代forms可能是更好的例子,比如boolean b = value >= x && value <= y; 这一切都落入了可怕的微观优化的世界。 是的,我知道:-) …虽然有趣? 更新只是为了解释我为什么感兴趣:我一直在盯着Martin Thompson在他的Mechanical Sympathy博客上写过的系统,在他来和Aeron 谈论之后 […]
对于Intel体系结构,是否有办法指示GCC编译器生成代码,这些代码始终会在代码中以特定方式强制执行分支预测? 英特尔硬件是否支持这个? 其他编译器或硬件呢? 我会在C ++代码中使用它,我知道我希望快速运行的情况下,而不必关心其他分支即使最近采取该分支时需要采取的减速。 for (;;) { if (normal) { // How to tell compiler to always branch predict true value? doSomethingNormal(); } else { exceptionalCase(); } } 作为Evdzhan Mustafa的后续问题,提示只是第一次指出处理器遇到该指令时的提示,所有后续的分支预测,function是否正常?
具体来说,如果我有一系列if … else if语句,而且事先知道每个语句的相对概率都是true ,那么它在执行时间上有多大的区别呢? 例如,我应该喜欢这个: if (highly_likely) //do something else if (somewhat_likely) //do something else if (unlikely) //do something 这个? if (unlikely) //do something else if (somewhat_likely) //do something else if (highly_likely) //do something 看起来很明显,sorting的版本会更快,但是为了可读性或副作用的存在,我们可能想要对它们进行非最优sorting。 在实际运行代码之前,也很难判断CPU如何处理分支预测。 所以在试验过程中,我最终回答了自己的一个具体案例的问题,但是我也希望听到其他意见/见解。 重要的是:这个问题假设if语句可以被任意地重新sorting而不会对程序的行为产生任何其他影响。 在我的回答中,三个条件testing是相互排斥的,不会产生副作用。 当然,如果这些陈述必须以一定的顺序进行评估以达到一些理想的行为,那么效率问题就没有意义了。
我正在用Java编写一些代码,在某些情况下,程序stream由两个intvariables“a”和“b”是否非零来确定(注意:a和b从不是负数,从不在整数溢出范围内)。 我可以用它来评估它 if (a != 0 && b != 0) { /* Some code */ } 或者, if (a*b != 0) { /* Some code */ } 因为我希望那段代码每次运行数百万次,所以我想知道哪一个会更快。 我通过在一个巨大的随机生成的数组上进行比较来做实验,我也很好奇数组的稀疏性(数据分数= 0)如何影响结果: long time; final int len = 50000000; int arbitrary = 0; int[][] nums = new int[2][len]; for (double fraction = 0 ; fraction <= 0.9 […]
这是一个C ++代码,看起来很奇特。 出于一些奇怪的原因,对数据进行奇迹sorting使得代码快了近6倍。 #include <algorithm> #include <ctime> #include <iostream> int main() { // Generate data const unsigned arraySize = 32768; int data[arraySize]; for (unsigned c = 0; c < arraySize; ++c) data[c] = std::rand() % 256; // !!! With this, the next loop runs faster std::sort(data, data + arraySize); // Test clock_t start = clock(); […]