我有2個服務器有不同的規格,但他們都運行相同的應用程序。這怎麼可能? Parallel.For奇怪
服務器1是2 x 2.4 Ghz的Hyper-V,服務器是VPS,具有2個Intel Xeon CPU E5540 2.53Ghz。
我有一個通用的處理程序,它從一個窗體獲取一些東西,並使用Parallel.For以並行方式處理一些對象列表上的一些數據。我使用默認的MaxDegreeOfParallelism。沒什麼奇怪的
但是......當我啓用一些日誌記錄來弄清楚爲什麼第二臺服務器在做第一臺服務器時所做的同樣的事情時更好(更快),結果與您通常認爲的現實應該是不一致的。
「問題」 時,予有從服務器1,它看起來像這樣(摘錄)日誌:
ÖVERKALIX - > table.Select [1]:78.125毫秒doubles.AddRange:0毫秒 結果[0]:0毫秒
ÖVERKALIX - > table.Select [1]:62.5毫秒doubles.AddRange:0 MS結果 [0]:0毫秒
ÖVERTORNEÅ - > table.Select [1]: 62.5 ms加倍.AddRange:0 ms結果 [0]:0 ms
ÖVERTORNEÅ - > table.Select [1]:78.125毫秒doubles.AddRange:0毫秒 結果[0]:0毫秒
總servertid ATT exekvera 592frågor:20062.5毫秒
而一個記錄從第二個這樣的(摘錄):
ÖVERKALIX - > table.Select [1]:99毫秒doubles.AddRange:0 MS結果 [0]:0毫秒
ÖVERKALIX - > table.Select [1]:103毫秒doubles.AddRange:0 MS結果 [0]:0毫秒
ÖVERTORNEÅ - > table.Select [1]:100毫秒doubles.AddRange:0毫秒結果 [0]:0毫秒
ÖVERTORNEÅ - > table.Select [1]:104毫秒doubles.AddRange:0 MS結果 [0]:0毫秒
總servertid ATT exekvera 592frågor:4479毫秒
如果你看看它,你會發現somethi ng在這裏很奇怪。第一臺服務器比第二臺服務器更快地執行所有單個查詢,但所有查詢的總時間超過第二臺服務器...
爲什麼?
你通常會想到的是,如果有N個操作來完成,每個操作需要牛逼毫秒,那麼,操作的總時間應該不會超過,如果你有n個操作其中的每一個操作需要(例如)(t + 1)ms。
但無論如何,我們在這裏的是日誌說t>(t + 1)是真的。我很失望!那麼,我不是專家,但那是不可能的:)
那麼,你對此有什麼想法?
這是由於一些超線程的東西?
是因爲它需要更多時間在第一臺服務器上產生一個新線程(這看起來像是最合理的答案)?
如果是由於線程創建問題,有什麼辦法可以測量這個嗎?
UPDATE:
我特地深入到問題的模式出現。下面是從服務器1的一些數據(以毫秒時間):
78.125 187.5 78.125 93.75 62.5 62.5 62.5 78.125 46.875 78.125 46.875 1203.125 62.5 78.125 62.5 46.875 78.125 62.5 62.5 1484.375 62.5 62.5 1437.5 62.5 78.125
在這裏是在服務器2上執行的相同的查詢:
正如你可以看到,服務器1是速度快,但偶爾(如值:1203.125 ,1484.375和2500),它需要很多的時間比服務器2
所以,似乎服務器1快上一小部分的查詢和服務器2更快(更平滑?)或大集的查詢?
可以從這些數字得出任何結論嗎?
爲什麼我們看到這些差異?
在此先感謝!
幾乎任何可能導致本 - I/O,其他進程...您需要的方式更好的測試,如果你真的想搞清楚。我建議你放棄它。 – 2012-02-03 22:02:52
關於你的第一個時代問題;很明顯,你沒有顯示所添加的所有內容。即使服務器2次不加總計顯示;所以不可能說出你做錯了什麼。 – NotMe 2012-02-03 22:03:01
@HenkHolterman,是的,我想我會放棄這個,因爲我可能會在不久的將來轉移到基於GPU的計算模型。 – Johan 2012-02-03 23:58:20