SORU
15 Ocak 2013, Salı


GPU yükü altında CGEventPost zayıf performans

Kuvars Olayları ile performans sorunu sendeledi ettik, özellikle CGEventPost: ağır GPU sırasında yük CGEventPost engelleyebilirsiniz. a small benchmark application to demonstrate the issue yarattık. Bu uygulama, yazı ve bültenleri olayları yaratan sadece bir döngü.

Uygulama çalıştırma sonuçları görebilirsiniz. İlk çalışma boşta çalışma sistem. İkinci çalışma FurMark GPU stress test) kadranın mümkün olduğunca derecede yüksektir.

  • İç döngü sürer nasıl iç, temelde sadece oluşturma, gönderme ve Kuvars Olaylarla ilgili bir olay serbest.
  • Bizim program (uyku) uyanmak için bekliyor nasıl dış. Biz uyku saatine yakın olması gerekir, ama eğer sistem basınç altında ise gecikmeli olabilir.
  • Post olay sonrası alır.

18:58:01.683 EventPerformance[4946:707] Measurements: (outer should be close to 10)
18:58:01.684 EventPerformance[4946:707] inner (ms): 0.04, outer (ms): 11.02, CGEventPost (ms): 0.03
18:58:01.684 EventPerformance[4946:707] inner (ms): 0.04, outer (ms): 11.02, CGEventPost (ms): 0.03
18:58:01.685 EventPerformance[4946:707] inner (ms): 0.07, outer (ms): 10.26, CGEventPost (ms): 0.03
18:58:01.685 EventPerformance[4946:707] inner (ms): 0.06, outer (ms): 10.85, CGEventPost (ms): 0.05
18:58:01.686 EventPerformance[4946:707] inner (ms): 0.07, outer (ms): 10.41, CGEventPost (ms): 0.04
18:58:01.686 EventPerformance[4946:707] inner (ms): 0.04, outer (ms): 10.39, CGEventPost (ms): 0.03
18:58:01.686 EventPerformance[4946:707] inner (ms): 0.05, outer (ms): 11.02, CGEventPost (ms): 0.03
18:58:01.687 EventPerformance[4946:707] inner (ms): 0.03, outer (ms): 10.67, CGEventPost (ms): 0.03
18:58:01.687 EventPerformance[4946:707] inner (ms): 0.08, outer (ms): 10.09, CGEventPost (ms): 0.05
18:58:01.688 EventPerformance[4946:707] Averages: (outer should be close to 10)
18:58:01.688 EventPerformance[4946:707] avg inner (ms): 0.05, avg outer (ms): 10.64, avg post (ms): 0.03

Burada olay gönderme ortalama 0.03 ms aldığını görüyoruz. Ayrıca iplik 0.5 ms etrafında çok geç uyanmış gibi görünüyor. CGEventPost sivri yok.

19:02:02.150 EventPerformance[5241:707] Measurements: (outer should be close to 10)
19:02:02.151 EventPerformance[5241:707] inner (ms): 0.03, outer (ms): 10.23, CGEventPost (ms): 0.02
19:02:02.151 EventPerformance[5241:707] inner (ms): 0.02, outer (ms): 10.54, CGEventPost (ms): 0.02
19:02:02.151 EventPerformance[5241:707] inner (ms): 0.02, outer (ms): 11.01, CGEventPost (ms): 0.01
19:02:02.152 EventPerformance[5241:707] inner (ms): 0.02, outer (ms): 10.74, CGEventPost (ms): 0.01
19:02:02.152 EventPerformance[5241:707] inner (ms): 0.02, outer (ms): 10.20, CGEventPost (ms): 0.01
19:02:02.152 EventPerformance[5241:707] inner (ms): 10.35, outer (ms): 11.01, CGEventPost (ms): 10.35
19:02:02.152 EventPerformance[5241:707] inner (ms): 0.03, outer (ms): 10.02, CGEventPost (ms): 0.02
19:02:02.153 EventPerformance[5241:707] inner (ms): 58.90, outer (ms): 10.11, CGEventPost (ms): 58.90
19:02:02.153 EventPerformance[5241:707] inner (ms): 0.03, outer (ms): 10.12, CGEventPost (ms): 0.02
19:02:02.153 EventPerformance[5241:707] Averages: (outer should be close to 10)
19:02:02.371 EventPerformance[5241:707] avg inner (ms): 7.71, avg outer (ms): 10.44, avg post (ms): 7.71

Sistem ağır GPU yük altında olduğunda, olay kaydı (sivri) mikrosaniye yerine milisaniye sürebilir. Extreme GPU yük altında (&; 1 lt KADAR), bu değer saniye sürer. CGEventPostbazenGPU için bazı işe dönmeden önce. bitmesini beklemek gibi görünüyor Bizim iş parçacığı hala normal olarak hiçbir fark gecikme/sivri (dış) ile yapılacak.

Herhangi bir fikir takdir edilmektedir.

CEVAP
19 Mart 2013, Salı


Sıra (temel mach bağlantı noktası) dolduruyor sanırım...

Bu "" ya da "sistem" diyoruz Aletleri enstrüman. zamanlama kullanarak onaylayabilirsiniz (Yeni boş bir belge oluşturmak, aleti, File > Record Options... altında olduğundan emin olun "mod" kontrol edilir.) ertelenmiş Ekle Bu uygulama (iş parçacığı uyurken blok, ne zaman aktif oldukları zaman ve neden) tüm iplik faaliyet gösterecek.

İlk iş parçacığı önceliği (bkz. yükselterek denemek istiyorum Konu CGEventPost arıyorum man 3 PTHREAD_SCHEDPARAM). Eğer iplik daha düşük öncelikli bir iş parçacığı bloke olursa, çekirdek geçici olarak engelleme iplik öncelik inversion önlemek için yüceltmek ve önceki görevi tamamlamak yardımcı olmalıdır.

Genel bir uygulamak gerekir bence2-iplik çözümaşağıda gibi

Göndermek istediğiniz olaylar için bir sıra oluşturun. Sonrası olaylar bu sıra sizin ana iş parçacığı (veya olay gönderme thread), sonra sinyal ikinci bir iş parçacığı (bir olay tüketici parçacığı oluşturmak için) yürüyüş sırası ve sonrası herhangi bir olağanüstü olayları ile CGEventPost.

CGEventPost engellediğinde, ikinci olay gönderme parçacığı engeller, ama bu başka bir iş parçacığı engellemez. CGEventPost sonunda yararlı bir araçtır, herhangi bir olağanüstü olay tüketici iplik yazan ve tüketici iplik olaylar devam ettirme halinde tüketir.

Başka bir olasılık: olaylar coallesce misin? Belirli olay türleri (fare hareket?) az olaylara coallesce olabilir. Muhtemelen hala zaman CGEventPost sıra sınırı içine çalışacak, bence 2-iplik yaklaşım muhtemelen en iyi bahistir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ChannelRichard

    ChannelRicha

    7 Kasım 2008
  • Chuck Testa

    Chuck Testa

    14 AĞUSTOS 2011
  • K-391

    K-391

    23 EKİM 2012