2015-11-26 25 views
0

我寫了兩個程序,它們用一定數量的矩形使用黎曼和來計算函數的面積,一個用Go編寫,另一個用C++編寫。爲什麼我的程序在分配更多的線程時花費更長的時間執行?

目標是測量執行時間,並查看多線程中哪種語言更快。

我使用bash腳本4在32核心服務器(雙Intel Xeon)上運行程序,以1,2,4,8,16和32線程運行它。該腳本使用time --format %U來獲取執行時間。

但是正如你在運行Go版本的結果中看到的那樣,使用1個核心的時間是1.19秒,而32個核心的時間是1.69秒!我認爲使用更多的內核會使計算速度更快...

我編寫我的程序時發生了錯誤嗎?時間的衡量準確嗎?或者,也許結果是好的,但如何?

非常感謝您的回答!

來源:

Go代碼:https://github.com/Mistermatt007/Benchmark-go-vs-cpp/blob/master/CalculGo/Calcul.go

C++代碼:https://github.com/Mistermatt007/Benchmark-go-vs-cpp/blob/master/CalculCpp/Calcul.cpp

啓動腳本:https://github.com/Mistermatt007/Benchmark-go-vs-cpp/blob/master/script/Launch.sh

黎曼和:http://mathworld.wolfram.com/RiemannSum.html

第一的成績:https://github.com/Mistermatt007/Benchmark-go-vs-cpp/blob/master/results/GoVSCpp.txt

+0

看看這裏:http://stackoverflow.com/questions/16964563/why-is-multithreaded-slower – Jerome

+1

取決於你的代碼。僅僅因爲你使用多線程並不意味着你會得到更快的代碼。實際上,多線程代碼很容易比單線程版本慢。 這是一個艱難的領域。 :) – Melkon

+0

@Jerome我已經刪除了所有打印東西,以加快速度 – Mistermatt

回答

9

根據man time

的該過程直接使用(在用戶模式),以秒爲CPU-秒ù總數。

您正在測量CPU-秒,即每個CPU累積花費的時間,而不是「wallclock」秒。這項措施不會因爲額外的線程而下降,因爲它與恆定的工作量成正比。另一方面,這可能會隨着線程數量的增加而增加,因爲每個新線程都會產生一些額外的簿記。

如果要列出「真實」時間,請使用%e說明符。

+0

我已經將%U提供的輸出除以所使用的內核數量,現在用%e給出了比以前更大的時間 – Mistermatt

相關問題