, Interlocked.Increment
lock()
daha iyi performans olacaktır. Sadece bir "bus lock" deyimine dönüştüğünü ve değişkenin doğrudan (x86) veya (x64) 'e eklendiğini (= x64) değiştirdiğini göreceğiniz IL ve Assembly'e bir göz atın.
Bu "veri yolu kilidi" deyimi, çağrı yapan CPU çalışırken, başka bir CPU'nun veri yoluna erişmesini engellemek için veri yolunu kilitler. Şimdi, C# lock()
ifadesinin IL'sine bir göz atın. Burada bir bölümü başlatmak veya bitirmek için Monitor
numaralı telefonu göreceksiniz.
Başka bir deyişle, .Net lock()
ifadesi .Net Interlocked.Increment
'dan daha fazlasını yapıyor.
SO, yapmak istediğiniz tek şey bir değişkeni arttırmaksa, Interlock.Increment
daha hızlı olacaktır. Mevcut çeşitli atomik işlemleri görmek ve gereksinimlerinize uyanları bulmak için Tüm Kilitli yöntemleri gözden geçirin. Birden çok ilişkili ilişkili artışlar/azaltmalar gibi karmaşık şeyler yapmak veya tamsayılardan daha karmaşık olan kaynaklara erişimi serileştirmek için lock()
kullanın.
Uygulama ayrıntıları için bağlama – fsimonazzi
-1 eklemeye devam edin. Kilitlemenin bir atomik işlemden çok daha yavaş olduğu doğrudur, ancak bunun IL ile hiçbir ilgisi yoktur. Bu işlev çağrıları, IL'lerin doğası gereği olmayan semantikleri için olmasa bile, bir atomik işlemden çok daha hızlı olacaktır. – Puppy