是Interlocked.Read(ref long)
在64位體系結構上「優化」了嗎?即如果我正在編寫一個可供兩種體系結構使用的庫,我應該關注在64位CPU上不必要地使用Interlocked.Read
會對性能產生的影響嗎?Interlocked.Read/Exchange在64位體系結構上長時間
我想過用這樣的事情,所以我想知道,如果這是有道理的:
// X64 is a preprocessor constant set for x64 builds
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static long Read(ref long address)
{
#if X64
// atomic on 64-bit processors
return address;
#else
// if I got it right, this creates a full memory barrier
return Interlocked.Read(ref address);
#endif
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Write(ref long address, long value)
{
#if X64
// atomic on 64-bit processors
address = value;
#else
// if I got it right, this creates a full memory barrier
Interlocked.Exchange(ref address, value);
#endif
}
你不應該擔心「使用'Interlocked.Read'的性能影響」 –
@亨克:我認爲這是「不要過早優化」,而不是「不要優化永久,期限」。如果多個線程同時使用此代碼,我不認爲每次訪問都需要有完整的內存屏障。此外,擁有32位處理器的個人電腦已經足夠低,而且只會更低。 – Lou
當然我是誇張的,但你應該真的證明這是瓶頸。我會假設Interlocked知道目標平臺的需求,並且在分析點指向它之後,只會對此感到困擾。即使我不知道你的代碼,我會說這是不太可能的。 –