Bazı kodları pencerelere yüklüyorum ve iş parçacığının son derece yavaş olduğunu buldum. Görev, pencereler üzerinde 300 saniye (iki xeon E5-2670 8 çekirdekli 2.6 ghz = 16 çekirdekli) ve 3,5 saniye (linux üzerinde xeon E5-1607 4 çekirdekli 3 ghz) alır. Vs2012 ekspresinin kullanılması.Pencereleri bağlama konuları. Kritik bölümler çok yavaştır
Tüm Std :: stack, SignCriticalSection ve bazı çalışma (toplamda 250k iş) bir 80 byte işi haşhaş, tüm EnterCriticalSection() çağıran 32 iş parçacığı var.
Her önemli bölümden önce ve sonra çağrı, iş parçacığı kimliğini ve geçerli saati yazdırırım.
- tek parçacığının kilit bekleme süresi yığını alır kapalı ~ iş alır ~ 3ms
- çağrılması izni alır ~ 3ms
- işi pop için ~
- 160ms olan 1 ms
dışarı yorumlarında:
(. P Debug/Release için kabaca aynı, ayıklama biraz daha uzun sürer düzgün kod profil edebilmek isteriz) İş görüşmesi tüm işlemin 2 saniye sürmesini sağlar (yine de linux'den daha fazla).
Her iki sorgusu da trydeTimeTime denedim, her ikisi de aynı sonucu veriyor.
AFAIK, bu iş hiçbir zaman hiçbir eşzamanlama yapmaz, ancak yavaşlatma işlemini açıklayamaz.
Niçin bir yığından kopyalanıp pop çağırmanın bu kadar uzun sürdüğü konusunda hiçbir fikrim yok. Başka bir kafa karıştırıcı şey ise,() beklemenin çok uzun sürmesidir.
Neden herkes bu kadar yavaş koştuğunu açıklayabilir mi?
İşlemcideki farkın 100x'lik bir performans farkı vereceğini düşünmezdim, ancak ikili CPU'larla ilgili olabilir mi? (iç çekirdekten daha farklı CPU'lar arasında senkronizasyona sahip olmak).
Bu arada, std :: thread'in farkındayım ancak kitaplık kodumun C++ 11 ile çalışmasını istiyorum. windows ipler süper çekişme karşı karşıya gibi
düzenlemek
//in a while(hasJobs) loop...
EVENT qwe1 = {"lock", timeGetTime(), id};
events.push_back(qwe1);
scene->jobMutex.lock();
EVENT qwe2 = {"getjob", timeGetTime(), id};
events.push_back(qwe2);
hasJobs = !scene->jobs.empty();
if (hasJobs)
{
job = scene->jobs.front();
scene->jobs.pop();
}
EVENT qwe3 = {"gotjob", timeGetTime(), id};
events.push_back(qwe3);
scene->jobMutex.unlock();
EVENT qwe4 = {"unlock", timeGetTime(), id};
events.push_back(qwe4);
if (hasJobs)
scene->performJob(job);
ve kaldırılan Linux #Ifdef şeylerle muteks sınıfı ...
CRITICAL_SECTION mutex;
...
Mutex::Mutex()
{
InitializeCriticalSection(&mutex);
}
Mutex::~Mutex()
{
DeleteCriticalSection(&mutex);
}
void Mutex::lock()
{
EnterCriticalSection(&mutex);
}
void Mutex::unlock()
{
LeaveCriticalSection(&mutex);
}
Linux'ta ne kullanıyordunuz? Sadece std :: stack'a kritik bölümlerle erişimi mi koruyorsunuz? – xanatos
İş parçacığı kimliğini ve geçerli saati nereye yazdırırsınız? – avakar
Dil seçin. Ve bu tuhaf görünüyor. Kesinlikle * sesler * [SSCCE] (http://www.sscce.org) çalışılabilir olması için yeterince basit. Windows'taki deneyimim, karşılaştırmalı olarak donanmış bir Linux dağıtımıyla karşılaştırıldığında biraz daha cılız oldu, ancak bu gerçekten oldukça geniş bir uçurum gibi görünüyor. – WhozCraig