MSDN のドキュメントによると、__faststorefence
は より高速です_mm_sfence
。私のタイミングでは、3倍以上遅くなります。
プラットフォーム: Win7-64、x64 SDK を使用した Visual Studio 2010。
#include <windows.h>
#include <xmmintrin.h>
#include <intrin.h>
int main(int argc, char* argv[])
{
int* x = new int;
__int64 loops = 1000000000; // 1 billion
__int64 start, elapsed;
start = __rdtsc();
for (__int64 i = 0; i < loops; i++)
{
*x = 0;
_mm_sfence();
}
elapsed = __rdtsc() - start;
std::cout << "_mm_sfence: " << elapsed << std::endl
<< "average : " << double(elapsed) / double(loops) << std::endl;
start = __rdtsc();
for(__int64 i = 0; i < loops; i++)
{
*x = 0;
__faststorefence();
}
elapsed = __rdtsc() - start;
std::cout << "__faststorefence: " << elapsed << std::endl
<< average : " << double(elapsed) / double(loops) << std::end;
}
結果:
- _mm_sfence 平均: 5.7
- __faststorefence 平均: 18.37
__faststorefence はlock or DWORD PTR [rsp], ebp
、ebp がゼロに xor された を生成し、_mm_sfence はsfence
(当然のことながら)を生成します。
__faststorefenceのMSDN ドキュメントには、それよりも高速であると明示的に記載されている_mm_sfence
ため、私のテストが間違っているか、間違っているかのどちらかです。何か案は?