第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

為什么使用 ThreadLocal 的 Value 成員的本地副本更快,盡管它是引用類型?

為什么使用 ThreadLocal 的 Value 成員的本地副本更快,盡管它是引用類型?

C#
冉冉說 2023-07-09 10:00:54
我正在遵循并行編程模式:使用 .NET Framework 4 理解和應(yīng)用并行模式第 107 頁上的示例(https://www.microsoft.com/en-us/download/details.aspx?id=19222)。據(jù)稱,與使用 Threadlocal.Value 本身相比,使用 ThreadLocal 的 Value 成員的本地副本速度更快。我對此進(jìn)行了測試,確實(shí)如此。但為什么?從代碼中可以看出,_vector2.Value 的本地副本保存在 vector2 中,并且該本地副本用于對所有項(xiàng)求和。如果您使用 _vector2.Value[i] += _vector1.Value[i] 而不是 vector2[i] += vector1[i] 代碼運(yùn)行同樣好,盡管速度較慢。這就是文章中所說的?,F(xiàn)在 int[] 是一個引用類型。這意味著當(dāng)您在 vector2 中進(jìn)行復(fù)制時,您實(shí)際上是在復(fù)制 ThreadLocal 的 Value 成員中原始 int[] 的引用。通過注釋證實(shí)了這一點(diǎn)_vector2.Value = vector2。打印結(jié)果保持不變。所以,我認(rèn)為這個任務(wù)沒有必要?,F(xiàn)在,由于 _vector2.Value 和 vector2 引用相同的數(shù)據(jù),為什么使用本地副本 (vector2) 仍然更快?在我的測試中大約快了 4 倍。有人知道我錯過了什么嗎? class ReferenceList    {        const int VECTOR_LENGTH = 100000000;        private ThreadLocal<int[]> _vector1 = new ThreadLocal<int[]>(() => Enumerable.Range(1, VECTOR_LENGTH).ToArray());        private ThreadLocal<int[]> _vector2 = new ThreadLocal<int[]>(() => Enumerable.Range(1, VECTOR_LENGTH).ToArray());        internal void DoWork()        {            int[] vector1 = _vector1.Value;            int[] vector2 = _vector2.Value;            for (int i = 0; i < VECTOR_LENGTH; i++)            {                // This is the fast way (as in the document)                vector2[i] += vector1[i];                // This is the slow way                //_vector2.Value[i] += _vector1.Value[i];            }            // Since int[] is a reference type. This step is not needed, I think. The result is not influenced when commenting out this line            _vector2.Value = vector2;            Console.WriteLine($"Thread-{Thread.CurrentThread.ManagedThreadId} Result: {String.Join(", ", _vector2.Value.Take(10))}");        }
查看完整描述

1 回答

?
當(dāng)年話下

TA貢獻(xiàn)1890條經(jīng)驗(yàn) 獲得超9個贊

vector1是直接對數(shù)組的引用。沒有什么比這更快的了。

_vector1不是直接對數(shù)組引用。_vector1.Value將產(chǎn)生相同的值 - 但根據(jù)源代碼,需要付出一些努力才能獲得該值。因此,每次您要求.Value再次承受(執(zhí)行方法等)性能損失時(即使知道它將返回相同的值,也需要付出一些努力才能解決)。這忽略了其他相關(guān)成本,例如數(shù)據(jù)局部性可能減少、緩存未命中增加等。


查看完整回答
反對 回復(fù) 2023-07-09
  • 1 回答
  • 0 關(guān)注
  • 123 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號