我寫了兩段代碼,一段是隨機數除以2,另一段是右移一次相同的隨機數。據我瞭解,這應該產生相同的結果。但是,當我計算兩段代碼時,我始終都會收到數據,說明轉移速度更快。這是爲什麼?爲什麼在C++中劃分速度慢於bitshifting?
移碼:
double iterations = atoi(argv[1]) * 1000;
int result = 0;
cout << "Doing " << iterations << " iterations." << endl;
srand(31459);
for(int i=0;i<iterations;i++){
if(i % 2 == 0){
result = result + (rand()>>1);
}else{
result = result - (rand()>>1);
}
}
分割代碼:
double iterations = atoi(argv[1]) * 1000;
int result = 0;
cout << "Doing " << iterations << " iterations." << endl;
srand(31459);
for(int i=0;i<iterations;i++){
if(i % 2 == 0){
result = result + (rand()/2);
}else{
result = result - (rand()/2);
}
}
定時和結果:
$ time ./divide 1000000; time ./shift 1000000
Doing 1e+09 iterations.
real 0m12.291s
user 0m12.260s
sys 0m0.021s
Doing 1e+09 iterations.
real 0m12.091s
user 0m12.056s
sys 0m0.019s
$ time ./shift 1000000; time ./divide 1000000
Doing 1e+09 iterations.
real 0m12.083s
user 0m12.028s
sys 0m0.035s
Doing 1e+09 iterations.
real 0m12.198s
user 0m12.158s
sys 0m0.028s
Addtional信息:
- 編譯
- 我在虛擬化運行該安裝Fedora 20中,籽粒的時候我沒有使用任何優化:3.12.10-300.fc20.x86_64
使用優化秒。分析未優化的代碼沒有什麼意義。此外,差異非常小,我會比較100次左右。 – juanchopanza
@juanchopanza我使用優化的生產代碼。但是,我仍然想知道爲什麼會出現這種差異。而且,我已經多次運行這個比較,有許多不同的輸入大小,並且發現了類似的差異。 – Avery
然後,您應該編寫一些簡單的代碼,進行分區和移位,並查看使用優化和不使用優化的程序集。 – juanchopanza