簡體   English   中英

存儲錯誤的布爾值是否會消耗更少的電能?

[英]Does storing false bool values cost less electrical energy?

今晚要睡覺了,我一直在想:如果bool ,例如在 C++ 中,設置為false ,這意味着它的所有(8 或 16)位都設置為 0(似乎是)。

據我所知,零位意味着某些晶體管中沒有電流流動,因此, false bool會在某些電池低於true的設備中浪費能量?

因此,如果是,最好在函數中將默認值 boolean (甚至可能是其他)參數設置為false

代替:

void DrawImage(int x, int y, bool cached = true);

void DrawImage(int x, int y, bool not_cached = false);

據我所知,零位意味着某些晶體管中沒有電流流動,因此,假布爾值會在某些電池少於真值的設備中浪費能量?

不,不是因為這個原因。 CMOS 邏輯沒有電流在 static state 中流動,僅在狀態之間的轉換中(對寄生電容充電/放電,以及作為上拉和下拉晶體管都部分導通的任何直通電流) )。 當然,除了漏電流之外,這在較低時鍾速度下有些顯着。

CMOS 或多或少是對稱的,除了 N 溝道和 P 溝道 MOSFET 之間的差異,因此 1 在電壓狀態和晶體管如何讓電荷流動方面與 0 沒有區別。

在其他一些邏輯系列(如TTL(帶上拉電阻的雙極晶體管))中,一個門的 output 是正確的,其中晶體管會通過上拉電阻將電流拉至地。 但只適用於一扇門; 通常邏輯涉及多次反轉,因為放大器自然會反轉(在 CMOS 或 TTL 或 RTL 中)。

也僅用於用於參數傳遞的寄存器中的 64 位中的 1 位。 CPU 的流水線 state 和亂序執行機制比實際的架構 state(寄存器值)和正在操作的數據需要更多的晶體管(和門)。 所以 1 位的 state 可以忽略不計。

CPU 中的大量微型晶體管是 CPU 幾十年來一直使用 CMOS 邏輯的原因,否則那些通過 RTL 或 TTL 中的上拉電阻的 static 電流會將它們熔化。

即使使用 CMOS,功率密度自 2000 年代初以來一直是一個問題(頻率縮放的“功率牆”,如 現代微處理器 A 90 分鍾指南中所述!如果您想了解更多有關 CPU 設計注意事項的信息,這是非常重要的閱讀材料)。 在 CMOS 中,需要更高的電壓才能更快地切換(大約線性),並且電容器中的能量與 V^2 成比例。 並且電流僅在門從 0 切換到 1 時才會在 CMOS 中流動,反之亦然,而這種情況發生的速率是 CPU 時鍾的某個因素。 因此,在給定頻率下以最小電壓運行,功率與f^3左右成比例。


其他可能使創建 0 更便宜的因素

在 x86 上, xor edi, edi是比mov edi, 1便宜的指令 在 Sandybridge 系列 CPU 上,它甚至不需要后端的執行單元,所以這肯定是一些不需要切換的晶體管。 以及更小的指令(2 字節 vs. 5,或 3 用於mov dil, 3以犧牲部分寄存器性能為代價來節省代碼大小)。 所以傳遞一個0或許可以提高性能,讓相同數量的指令更快地完成,讓 CPU 更快地回到睡眠狀態(競爭睡眠)。 與否,可能很容易沒有效果,或者后面指令的不同代碼 alignment 可能恰好與較長的指令更好。

大多數其他 ISA 在寄存器中歸零與設置 1 之間沒有太大區別。 甚至在 x86 上,這通常也不是一個非常有價值的優化。

但是,如果您可以選擇一個特殊的值, 0是一個不錯的選擇,特別是對於非bool整數,因為測試0與非0比測試任何其他數字更有效 (例如,如果您使用普通intx != 0x == 1便宜。使用bool ,如果您執行b == true ,編譯器已經可以測試非零。)

雖然這在技術上可能會節省能源,但節省的量可以忽略不計,因為它只有一個位被設置為真或假,並且考慮到權衡,您必須使用 go 的長度才能使其值得。

即便如此,讓讀者跳過更多的心理障礙,讓你的代碼更難閱讀,因為不得不對布爾值三思而后行,這是一個壞主意。 不過,想想也很有趣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM