亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

簡單 C# 程序的驚人不同性能

簡單 C# 程序的驚人不同性能

C#
侃侃爾雅 2022-07-23 09:13:43
下面是一個簡單的程序,只需稍作改動,就會對性能產生重大影響,我不明白為什么。該程序所做的并不真正相關,但它通過計算兩個不同質量的物體與墻壁之間的碰撞以非常復雜的方式計算 PI。當我改變代碼時,我注意到性能上有很大的差異。有問題的行是數學上等價的注釋行。使用慢速版本使整個程序花費的時間大約是使用快速版本的兩倍。int iterations = 0;for (int i = 4; i < 9; i++){    Stopwatch s = Stopwatch.StartNew();    double ms = 1.0;    double mL = Math.Pow(100.0, i);    double uL = 1.0;    double us = 0.0;    double msmLInv = 1d / (ms + mL);    long collisions = 0;    while (!(uL < 0 && us <= 0 && uL <= us))    {        Debug.Assert(++iterations > 0);        ++collisions;        double vs = (2 * mL * uL + us * (ms - mL)) * msmLInv;        //double vL = (2 * ms * us - uL * (ms - mL)) * msmLInv; //fast        double vL = uL + (us - vs) / mL; //slow        Debug.Assert(Math.Abs(((2 * ms * us - uL * (ms - mL)) * msmLInv) - (uL + (us - vs) / mL)) < 0.001d); //checks equality between fast and slow        if (vs > 0)        {            ++collisions;            vs = -vs;        }        us = vs;        uL = vL;    }    s.Stop();    Debug.Assert(collisions.ToString() == "314159265359".Substring(0, i + 1)); //check the correctness    Console.WriteLine($"i: {i}, T: {s.ElapsedMilliseconds / 1000f}, PI: {collisions}");}Debug.Assert(iterations == 174531180); //check that we dont skip loopsConsole.Write("Waiting...");Console.ReadKey();我的直覺說,因為快速版本有 7 個操作,而慢版本有 4 個操作,所以慢版本應該更快,但事實并非如此。我使用 .NET Reflector 對程序進行了反匯編,結果顯示它們大部分是相同的,正如預期的那樣,除了下面顯示的部分。前后的代碼相同//slowldloc.s uLldloc.2 ldloc.s usldloc.s vssub mul ldloc.3 div add 
查看完整描述

2 回答

?
犯罪嫌疑人X

TA貢獻2080條經驗 獲得超4個贊

我認為原因是 CPU指令流水線。你的慢方程取決于vs,這意味著vs必須先計算,然后vl計算。

但是在您的快速方程式中,可以將更多指令流水線化vs并且vl可以同時計算,因為它們不相互依賴。

請不要將此與多線程混淆。指令流水線是在非常低的硬件級別實現的東西,它試圖同時利用盡可能多的 CPU 模塊來實現最大的指令吞吐量。


查看完整回答
反對 回復 2022-07-23
?
躍然一笑

TA貢獻1826條經驗 獲得超6個贊

你的計算不相等


double vL = (2 * ms * us - uL * (ms - mL)) / (ms + mL); //fast

double vL = uL + ms * (us - vs) / mL; //slow

示例:我錯過vs了快速版本


我希望您的 while 循環因此進行更多迭代?


查看完整回答
反對 回復 2022-07-23
  • 2 回答
  • 0 關注
  • 115 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號