SORU
13 HAZİRAN 2014, Cuma


Yığın boyutu 50 ile bir iş parçacığı oluşturulurken varsayılan tehlikeleri nelerdir?

Ben şu anda çalışan bir çok kritik performans programı ve bir yol karar verdim keşfetmek için yardımcı olabilecek kaynak tüketimini azaltmak oldu benim artan işçi iş parçacığı yığın boyutu yani hareket en verileri (float[]s) olacağım erişiliyor üzerine yığın (kullanarak stackalloc).

I read varsayılan yığın boyutu için bir iş parçacığı 1), amacıyla hareket hepsi benim float[]ler yapmak zorunda kalacağımı genişletmek yığın tarafından yaklaşık 50 katı (50)~).

Ben bu genel olarak kabul edilir anlamak "güvensiz" ve, ama bu yöntem karşı benim geçerli kod kıyaslama sonra keşfettim tavsiye değil530%işlem hızı artırın! Yani ben sadece geçip bu seçenek olmadan daha fazla araştırma, hangi yol benim sorum şu; ne tehlikelerle ilişkili olan artan yığını için bu kadar büyük boyut (ters giden ne olabilirdi ve ne önlem alayım en aza indirmek için bu tür tehlikeler?

Benim test kodu

public static unsafe void TestMethod1()
{
    float* samples = stackalloc float[12500000];

    for (var ii = 0; ii < 12500000; ii  )
    {
        samples[ii] = 32768;
    }
}

public static void TestMethod2()
{
    var samples = new float[12500000];

    for (var i = 0; i < 12500000; i  )
    {
        samples[i] = 32768;
    }
}

CEVAP
13 HAZİRAN 2014, Cuma


Sam ile test kod karşılaştırdıktan sonra, her iki hakkımız olduğunu belirledi.
Ancak, farklı şeyler hakkında

  • Bellek (okuma ve yazma) erişiyorsadece hızlıyerde yığın, küresel ya da öbek.
  • Ayrılırkenbu, ancak, yığında en hızlı ve en yavaş yığın.

Şöyle bir şey: stack &; global < heap lt. (ayırma zamanı)
Teknik olarak, ayırma gerçekten bir ayırma değil, yığın, çalışma zamanı, sadece emin yığının bir parçası (Kare?) bu dizi için ayrılmış.

Ben bu işe şiddetle dikkatli olmak, ama tavsiye ederim.
Aşağıdaki tavsiye ederim:

  1. Hangi diziler sık sık oluşturmak için gereken zamanbırakınişlevi (başvuru geçerek, örneğin, yığın çok büyük bir gelişme olacak kullanarak.
  2. Eğer bir dizi geri dönüşüm olabilir, istediğiniz zaman bunu yapmak! Öbek uzun süreli depolama nesnesi için en iyi yerdir. (genel bellek kirletici güzel; yığın çerçeveler yok olabilir değil)

(Not: 1. yalnızca değer türleri için geçerlidir; referans tipleri heap ve 0 düşecektir parası) tahsis edilecek

Soru kendiliğinden cevap: büyük yığın test ile hiç bir sorunla karşılaşmadım.
Eğer sistem düşük çalışıyorsa iplik(ler) oluştururken eğer işlev çağrıları ile dikkat ve bellek yetersiz çalıştırıyorsanız, sadece olası sorunlar, yığın taşması inanıyorum.

Aşağıdaki bölümde ilk cevabım. Yanlış-ish ve testler doğru değil. Sadece referans için tutulur.


Benim test dizileri kullanım için yığın ayrılan bellek ve küresel bellek en az  daha yavaş (120% alır zaman) öbek ayrılmış bellek gösterir!

This is my test code ve bu örnek bir çıktı

Stack-allocated array time: 00:00:00.2224429
Globally-allocated array time: 00:00:00.2206767
Heap-allocated array time: 00:00:00.1842670
------------------------------------------
Fastest: Heap.

  |    S    |    G    |    H    |
-- --------- --------- --------- 
S |    -    | 100.80 %| 120.72 %|
-- --------- --------- --------- 
G |  99.21 %|    -    | 119.76 %|
-- --------- --------- --------- 
H |  82.84 %|  83.50 %|    -    |
-- --------- --------- --------- 
Rates are calculated by dividing the row's value to the column's.

Windows 8.1 Pro (Update 1), i7 4700 MQ bir kullanarak, altında test ettim .NET 4.5.1
İle 86 ve x 64 test ettim ve sonuçlar aynıdır.

Edit5-tüm iş parçacığı yığın boyutu 201 MB, boyutu 50 milyon örnek ve azalmış tekrarlamalar arttı.
Sonuçlarıaynı yukarıdaki gibi:

Stack-allocated array time: 00:00:00.4504903
Globally-allocated array time: 00:00:00.4020328
Heap-allocated array time: 00:00:00.3439016
------------------------------------------
Fastest: Heap.

  |    S    |    G    |    H    |
-- --------- --------- --------- 
S |    -    | 112.05 %| 130.99 %|
-- --------- --------- --------- 
G |  89.24 %|    -    | 116.90 %|
-- --------- --------- --------- 
H |  76.34 %|  85.54 %|    -    |
-- --------- --------- --------- 
Rates are calculated by dividing the row's value to the column's.

Ama, yığın aslında bu gibi görünüyoryavaşlamaya başladı.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Atlantic Records

    Atlantic Rec

    15 Aralık 2006
  • Philip DeFranco

    Philip DeFra

    16 EYLÜL 2006
  • steven johns

    steven johns

    11 Mart 2011