Interlocked.Read(ref long)
«оптимизирован» на 64-битных архитектурах? То есть если я пишу библиотеку, которая может использоваться обеими архитектурами, следует ли мне беспокоиться о влиянии на производительность использования Interlocked.Read
без необходимости на 64-битных процессорах?Interlocked.Read/Exchange для longs на 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 » –
@Henk: Я думал, что это« не оптимизировать слишком рано », а не« не оптимизировать когда-либо, период ». Если несколько потоков используют этот код одновременно, я не вижу необходимости иметь полный барьер для каждого доступа. Кроме того, количество ПК с 32-разрядными процессорами уже достаточно низкое и будет только ниже. – Lou
Конечно, я преувеличивал, но вы должны действительно продемонстрировать, что это задушающая точка. Я бы предположил, что Interlocked знает о потребностях целевой платформы и только беспокоится об этом после профайлов. И хотя я не знаю вашего кода, я бы сказал, что это очень маловероятно. –