2012-10-14 30 views
6

如果我有一個布爾和一些代碼可能會改變它,然後我想將它設置爲true,我應該檢查它是否是false在C++中設置它的值之前檢查變量是否更好?

例如:

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

VS

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

哪個更快?

注意

我問這個是因爲以下實施Sieve of Eratosthenes的:http://bloc.gerardfarras.com/wp-content/uploads/2011/12/erastotenes.txt

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

(如果numsprimers[i]==1這意味着i不是質數,如果是0,則可以是素數或不是)

+1

另一種將它想象爲:「爲什麼要檢查?只是覆蓋!」 – Mysticial

+0

@Mysticial其實我記得一個程序通過檢查一個布爾值來獲得巨大的速度提升,然後覆蓋它而不是覆蓋它。我沒有一個基準,但也許有一個值得去做... –

+0

@SethCarnegie它是一個用戶定義的類型嗎? – Mysticial

回答

2

這是非常非常挑剔的,但一般來說最好只是改變價值。

無論如何檢查和設置一個值的開銷大致相同,那麼爲什麼你想在某些情況下都必須這樣做?

現在,如果你想知道你是否應該覆蓋一些自定義的類型(可以說10萬個字的列表),或者如果您應該檢查,看看是否需要先覆蓋(讓我們通過簡單地檢查一個布爾值或者說一個時間戳),那麼你應該先檢查一下,因爲檢查一個布爾值或時間戳的代價遠遠小於將很多單詞寫入內存。

這當然都取決於各種事情,比如你正在編輯的內存是否在緩存中,「檢查」的代價是多少,你需要多長時間覆蓋一次值,多長時間一次不需要被覆蓋,當然還有內存的大小。

+1

鑑於你的Sieve,因爲唯一可能的值是0和1,我沒有理由在改變它之前檢查numsprimers [i]的值。畢竟這會產生幾條指令:獲得nuprimers [i]的價值。將它與0.跳轉到代碼中的其他地方,如果它是0. – Ben

+0

很久以前,也許我仍然得到一個答案: 在我的情況下,最多的元素仍然會有所需的值= true。 因此檢查值是否爲真可以避免再次將其設置爲真。 如果我們總共談論數千萬個元素,那麼「僅僅在沒有檢查之前就改變這個值」仍然是一個平等的快速操作? – Kaspatoo

+0

我覺得很奇怪,這裏沒有人解決多線程問題。據我所知(不管鎖定)寫入使緩存線「髒」,並強制所有其他核心重新加載它,而閱讀不。想到的一個顯而易見的問題是,是否將相同的值寫入緩存標記爲髒,並強制重新加載其他核心緩存,在某些情況下,它肯定會使「剛剛覆蓋」選項比檢查和覆蓋更慢(因爲支票會使其他核心的緩存保持原樣)。 – Cookie

0

如何:

if (b = !!cond) { 

} 

你在哪裏檢查的條件和值適用於b,如果有必要b有一個值。如果你想讓b保持真實,那麼我說要使用你的其他例子之一。它不應該有所作爲。

+0

但也許'cond'是'false'和'b'是'true'。我想'b'保持'真實'。 – Oriol

相關問題