Saya berdebat dengan seorang kolega, tentang lock_guard, dan dia mengusulkan bahwa lock_guard mungkin lebih lambat daripada mutex :: lock () / mutex :: unlock () karena biaya instantiate dan unistantiate class lock_guard.
Lalu saya membuat tes sederhana ini dan, anehnya, versi dengan lock_guard hampir dua kali lebih cepat daripada versi dengan mutex :: lock () / mutex :: unlock ()
#include <iostream>
#include <mutex>
#include <chrono>
std::mutex m;
int g = 0;
void func1()
{
m.lock();
g++;
m.unlock();
}
void func2()
{
std::lock_guard<std::mutex> lock(m);
g++;
}
int main()
{
auto t = std::chrono::system_clock::now();
for (int i = 0; i < 1000000; i++)
{
func1();
}
std::cout << "Take: " << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - t).count() << " ms" << std::endl;
t = std::chrono::system_clock::now();
for (int i = 0; i < 1000000; i++)
{
func2();
}
std::cout << "Take: " << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - t).count() << " ms" << std::endl;
return 0;
}
Hasil di mesin saya:
Take: 41 ms
Take: 22 ms
Adakah yang bisa menjelaskan mengapa dan bagaimana hal ini bisa terjadi?
std::lock_guard
sedikit lebih lambat, kecuali Anda dapat membuktikan bahwa itu penting dalam hal kinerja, kenaikan kecepatan tidak akan membatalkan manfaat lain dari penggunaanstd::lock_guard
(terutama RAII). Jikag++
ada sesuatu yang bisa melempar atau apapun yang mungkin berubah menjadi sesuatu yang berpotensi lebih rumit di masa depan Anda hampir harus menggunakan semacam objek untuk memiliki kunci.Jawaban:
Rilis build menghasilkan hasil yang sama untuk kedua versi.
The
DEBUG
build menunjukkan ~ 33% lebih lama waktu untukfunc2
; perbedaan yang saya lihat di pembongkaran yangfunc2
menggunakan__security_cookie
dan memanggil@_RTC_CheckStackVars@8
.Apakah Anda menghitung waktu DEBUG?
EDIT: Selain itu, ketika melihat
RELEASE
pembongkaran, saya perhatikan bahwamutex
metode disimpan dalam dua pendaftar:dan dipanggil dengan cara yang sama dari keduanya
func1
danfunc2
:sumber