2012-10-14 11 views
6

Boole ve belki de bunu değiştiren bir kod varsa ve true olarak ayarlamak istiyorum, false olup olmadığını kontrol etmeliyim? ÖrneğinDeğerini C++ olarak ayarlamadan önce bir değişkeni kontrol etmek daha iyi midir?

:

bool b = false; 
// Some code 
// Here "b" can be true or false 
if (cond) { 
    b = true; 
} 

bool b = false; 
// Some code 
// Here `b` can be `true` or `false` 
if (cond && !b){ 
    b = true; 
} 

hızlıdır

vs?

Not.

nedeniyle Sieve of Eratosthenes aşağıdaki uygulama isteriz: http://bloc.gerardfarras.com/wp-content/uploads/2011/12/erastotenes.txt

if ((i % divisor == 0) && (numsprimers[i] == 0)) { 
    numsprimers[i] = 1; 
} 

(numsprimers[i]==1 Eğer i bir asal sayı olmadığı anlamına gelir Ve 0 ise o başbakan olabilir ya da olmayabilir)

+1

Bunu düşünmenin başka bir yolu: "Neden kontrol edin? Sadece üzerine yaz!" – Mysticial

+0

@Mysticial aslında bir programın bir boole değerini kontrol ederek büyük bir hız artışı elde ettiğini ve üzerine yazmayı değil, üzerine yazdığını hatırlıyorum. Ben bir ölçüt yok ama belki de biri yapmaya değerdi ... –

+0

@SethCarnegie Kullanıcı tanımlı bir tip miydi? – Mysticial

cevap

2

Bu çok çok nitpicky olmakla birlikte, genel olarak sadece değeri değiştirmek daha iyidir.

Bir değerin kontrol edilmesi ve ayarlanması, yine de yine aynı ek yüke sahiptir, bu nedenle neden bazı durumlarda yapmak zorunda kalıyorsunuz?

Şimdi, bazı özel türlerin üzerine yazmanızın (100000 kelimelik bir listenin listesini söyleyiniz) mi yoksa ilk önce üzerine yazılması gerekip gerekmediğini kontrol etmenizin gerekip gerekmediğini merak ediyorsanız (yalnızca bir boolean değerini kontrol ederek veya Bir zaman damgası), ilk önce kontrol etmelisiniz, çünkü bir boole ya da zaman damgasını kontrol etme maliyeti, belleğe çok fazla sözcük yazmanın çok altındadır.

Bu, elbette, düzenlemekte olduğunuz belleğin önbellekte olup olmadığı, "check" nin ne kadar pahalı olduğu, ne sıklıkta ihtiyaç duyulmadığına göre ne sıklıkla yazmanız gerektiği gibi çeşitli şeylere bağlıdır. üzerine yazılacak ve elbette hafızanın büyüklüğü.

+1

Elekiniz göz önüne alındığında, olası tek değerler 0 ve 1 olduğundan, bunu değiştirmeden önce numsprimers [i] değerini kontrol etmek için bir neden göremiyorum. Bu, sonuçta birkaç talimatla sonuçlanır: Nuprimerlerin değerini [i]. 0 ile karşılaştırın. – Ben

+0

uzunsa kodu başka bir yere atlayın, belki hala bir cevap alıyorum: Benim durumumda, en çok elemanlar hala istenen değere sahip olacaktır. Bu nedenle, değerin hala doğru olup olmadığını kontrol etmek, tekrar doğru olarak ayarlanmasını önlemek olabilir. "Sadece kontrol etmeden önce değeri değiştirmeden", toplamda on milyonlarca elemandan bahsedersek, yine de hızlı bir çalışma olur mu? – Kaspatoo

+0

Burada hiç kimsenin çok iş parçacığına hitap etmemesi garip. Bildiğim kadarıyla (kilitlemeden bağımsız olarak) yazı bir önbellek çizgisini "kirli" hale getirir ve diğer tüm çekirdekleri yeniden yüklemeye zorlar, oysa okuma olmaz. Akla gelen bir soru, önbelleğe aynı değeri yazmak, onu kirli olarak işaretleyip işaretlemediğidir ve diğer temel önbellekleri yeniden yüklemeyi zorlar. Bu, belirli koşullar altında, "sadece üzerine yazan" seçeneğinin, kontrolden daha yavaş ve üzerine yazılmasını sağlar. (Çek, diğer çekirdeklerin önbelleğini sağlam bırakabilir). – Cookie

0

ne dersiniz: Eğer durumunu kontrol ve b bir değere sahip olması gerekiyorsa, b değer uygulamak

if (b = !!cond) { 

} 

. b'un doğru kalmasını istiyorsanız, diğer örneklerinizden birini kullanmayı söylüyorum. Bir fark yaratmamalı.

+0

Ama belki de 'koşul '' false' ve 'b'' true'dur. 'Doğru' kalmasını istiyorum. – Oriol

İlgili konular