Stackoverflow关于C++的Votes最高的一个问答
2014-10-07 19:03
253 查看
觉得挺好玩的,很多大神的回答会让人引起很多思考
先看看源程序
在我的电脑上,两次运行的结果分别是
排序后
![](http://img.blog.csdn.net/20141007190617203?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSGVsbG9fSHdj/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
不排序
![](http://img.blog.csdn.net/20141007190802193?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSGVsbG9fSHdj/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
通过对比我们发现,排序后的执行时间明显降低了。那么是为什呢?
主要的效率差别在这里
关于分支预测:http://baike.baidu.com/view/512423.htm?fr=aladdin
对于处理器底层代码,是
![](http://img.blog.csdn.net/20141007191335144?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSGVsbG9fSHdj/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
分支预测通俗来讲,就是处理器在每次if判断的时候,会根据之前判断的结果进行当前判断的预测,比如之前10次都是true,则先假定当前判断也是true,然后执行。如果发现执行失败,则回退到之前,把本次执行设为false。当数组排序之后,这些假定判断大部分将会成功,也就是说回退的次数会很少。
所以,减少if else是降低分支预测,提高速度的关键
stackflow上给出以下几种解决方式
1、将加法改为位运算,消除分支预测
最后,对于这个程序最直接的优化方式
执行的时间和结果
![](http://img.blog.csdn.net/20141007195641192?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSGVsbG9fSHdj/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
附上
建议去看看,因为确实很多思路很好,本文只是分析了部分
原问题连接:http://stackoverflow.com/questions/11227809/why-is-processing-a-sorted-array-faster-than-an-unsorted-array
先看看源程序
#include "stdafx.h" #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(); long long sum = 0; for (unsigned i = 0; i < 10000; ++i) { // Primary loop for (unsigned c = 0; c < arraySize; ++c) { if (data[c] >= 128) sum += data[c]; } } double elapsedTime = static_cast<double>(clock() - start) / CLOCKS_PER_SEC; std::cout << elapsedTime << std::endl; std::cout << "sum = " << sum << std::endl; }然后,对以上程序分别运行两次,第一次不排序,直接计算,第二次排序,在计算。(就是是否注释掉sort那一行的区别)
在我的电脑上,两次运行的结果分别是
排序后
不排序
通过对比我们发现,排序后的执行时间明显降低了。那么是为什呢?
主要的效率差别在这里
if (data[c] >= 128) sum += data[c];对于,底层处理器,每次if判断采用Branch Prediction,分支预测
关于分支预测:http://baike.baidu.com/view/512423.htm?fr=aladdin
对于处理器底层代码,是
分支预测通俗来讲,就是处理器在每次if判断的时候,会根据之前判断的结果进行当前判断的预测,比如之前10次都是true,则先假定当前判断也是true,然后执行。如果发现执行失败,则回退到之前,把本次执行设为false。当数组排序之后,这些假定判断大部分将会成功,也就是说回退的次数会很少。
所以,减少if else是降低分支预测,提高速度的关键
stackflow上给出以下几种解决方式
1、将加法改为位运算,消除分支预测
int t = (data[c] - 128) >> 31; sum += ~t & data[c];2、不进行判断
clock_t start = clock(); long long a[] = {0, 0}; long long sum; for (unsigned i = 0; i < 100000; ++i) { // Primary loop for (unsigned c = 0; c < arraySize; ++c) { int j = (data[c] >> 7); a[j] += data[c]; } } double elapsedTime = static_cast<double>(clock() - start) / CLOCKS_PER_SEC; sum = a[1];
最后,对于这个程序最直接的优化方式
#include "stdafx.h" #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(); long long sum = 0; // Primary loop for (unsigned c = 0; c < arraySize; ++c) { if (data[c] >= 128) sum += data[c]; } sum = sum*10000; double elapsedTime = static_cast<double>(clock() - start) / CLOCKS_PER_SEC; std::cout << elapsedTime << std::endl; std::cout << "sum = " << sum << std::endl; }这样,会将执行的效率提高10000倍
执行的时间和结果
附上
建议去看看,因为确实很多思路很好,本文只是分析了部分
原问题连接:http://stackoverflow.com/questions/11227809/why-is-processing-a-sorted-array-faster-than-an-unsorted-array
相关文章推荐
- 一个关于C++ Inline关键字的引发的一个错误
- 整理的一个csdn的帖子,关于C++中的对齐的
- 一个用ASP.NET MVC建立的编程技术问答网站:stackoverflow
- 关于派生类的构造的——一个程序的分析(钱能c++ P353),加上了析构函数
- 关于派生类的构造的——一个程序的分析(钱能c++ P353),加上了析构函数
- 关于封装--一个有趣的C++例子
- (转)一个关于VC++6.0与标准C++差异处理的小技巧
- 一个C++关于类使用的问题!
- C++ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间
- 关于C++ 中的插入符 << : 一个奇怪的现象
- 有关于.net的垃圾回收的一个问答
- 关于c++ fstream的一个容易使用出错的地方。
- 一个关于c++字符串处理和delete[]与delete差别的问题
- C/C++问答(3):关于构造和析构函数使用多态
- C++ 中关于一个线性时间算法(linear-time algorithm)
- [初]一个C++关于string的小问题
- 一个关于2的n次方的代码(C++)
- 关于rand()的函数: 请问一个关于C++的问题...
- 关于c++中的一个母牛生小牛的问题详细解答与体会
- 关于C++私有承继的一个问题