2013-02-21 37 views
8

Benim kodunda çok performans kritik yerde geçerli çalışan iş parçacığı kimliği kullanmak için gidiyorum, bu yüzden bir yere bu kimliği önbelleğe ya da (pencereler için Unix benzeri sistemler için gettid ve GetCurrentThreadId) bir yöntemi çağırmak isteyip seçmeliyim her zaman almak için. Peki hangisi daha iyi? İş parçacığı kimliği sistem çağrısı alıyor mu?Geçerli iplik zamanının id alma işlemi pahalı mı?

cevap

0

Hayır, pahalı bir çağrı değildir. Bu bir sistem çağrısı ya da benzeri, ancak pahalı olandan uzak. Basit bir değişkendeki değeri önbelleğe alabilir eğer Açıkçası, o 10.

kat daha hızlı yapar Ama bütün performans ile ilgili sorgular gibi, bu karşılaştırma için aşağı gerçekten bu. Tek bir iş parçacığı kullanmak için işleri kolayca ayarlayabilirsiniz, iş parçacığı kimliğini almak için işlevi çağırın ve yapmak istediğiniz şeyi yapın. Bununla bir test yapmanın ne kadar sürdüğünü ölçün. Ardından, iş parçacığı kimliği için aramayı aynı aralıktaki sabit bir değerle değiştirin ve bunun nasıl çalıştığını görün.

7

En azından Windows'ta, GetCurrentThreadId()oldukça ucuzdur ve sistem çağrısı içermez. Biraz kendi değişkendeki değeri önbelleğe için yarar değil, bir sürü olabilir

int GetCurrentThreadId() { 
    _asm { 
     mov eax, fs:[18h] 
     mov eax, [eax+24h] 
    } 
} 

: Temel olarak dışarı çalışır. Değişkeninizi diğer sık ​​kullanılan değişkenler ile birlikte sakladığınızda, ana yararı muhtemelen (ve dolayısıyla önbellek kullanımını) artırabilir.

Yani, böyle sıkı bir döngü üzerinde çalışmadığınız sürece, bellek getirme (veya muhtemelen iki) ortadan kaldırma olasılığının önemli olduğunu, döndürdüğü değeri önbelleğe alarak çok fazla kazanma olasılığınız yoktur.

+1

ben Unix gördük (ler) (mühim değil, fakat gs) aynı şeyi. Yani cevabınız çoklu platformlar için doğrudur. Çok ucuz. – boiler96

İlgili konular