題:
即使我有足夠的空間,我是否也應該嘗試使草圖盡可能小?
Anonymous Penguin
2014-03-19 05:15:30 UTC
view on stackexchange narkive permalink

最近有很多關於縮小草圖的討論,但是如果您不需要空間,應該這樣做嗎?會加速我的程序嗎? } void loop(){digitalWrite(led,HIGH); //打開LED(HIGH是電壓電平)delay(1000); //等待第二個digitalWrite(led,LOW); //通過使電壓為LOW delay(1000)來關閉LED; //等待第二個digitalWrite(led,HIGH); //打開LED(HIGH是電壓電平)delay(1000); //等待第二個digitalWrite(led,LOW); //通過使電壓為LOW delay(1000)來關閉LED; //等待第二個digitalWrite(led,HIGH); //打開LED(HIGH是電壓電平)delay(1000); //等待第二個digitalWrite(led,LOW); //通過使電壓為LOW delay(1000)來關閉LED; //等待第二個digitalWrite(led,HIGH); //打開LED(HIGH是電壓電平)delay(1000); //等待第二個digitalWrite(led,LOW); //通過使電壓為LOW delay(1000)來關閉LED; //等待第二個val = digitalRead(10);}

在Arduino Uno上的1,396字節。現在讓我們縮小一下:

  int led = 13; int val; void setup(){pinMode(led,OUTPUT); } void loop(){blink(); val = digitalRead(10);} void blink(){digitalWrite(led,HIGH); //打開LED(HIGH是電壓電平)delay(1000); //等待第二個digitalWrite(led,LOW); //通過使電壓為LOW delay(1000)來關閉LED; //等待一秒鐘}  

1,270字節。減少10%!它可能會縮小更多。 我有空間...使它盡可能緊湊(或者使其保持“未壓縮”狀態?)效率更高(就速度而言)? (不多)調用 blink(); ,因此減慢了我的代碼的速度。這是真的?使其盡可能小(除了存儲/分發C ++文件之外)還有其他優點/缺點嗎?

我認為,人們應該對自己的代碼保持謹慎,但是在不必要的情況下,切勿訴諸微優化。
對我來說,關於代碼的首要問題是它的“可讀性”。如果時間更長,可能會更加困難,或者可能需要更長的時間才能正確理解。如果gvensize優化使代碼更清晰,則應使用它。
五 答案:
alexan_e
2014-03-19 13:30:20 UTC
view on stackexchange narkive permalink

您的第二個代碼的大小可能較小,但是由於函數調用的開銷,最大執行速度降低了。
這對您來說重要嗎?不,因為總會有很大的延遲,但是如果代碼是實際的一系列重複計算,應該盡快執行,那麼效果會有所不同。

通常,較小的代碼是

有關代碼優化(大小或速度)的信息,您可以參考Atmel的本應用筆記 AVR4027:優化8位AVR微控制器C代碼的技巧和竅門

我可以重複這裡所說的所有內容,但我認為沒有意義,您可以直接閱讀原始文章。


關於編譯器優化水平。 Arduino IDE使用avr-gcc編譯器的 Os 優化設置。
avr-gcc可用的優化級別為( source1 source2

  • O0或無-O選項
    在此優化級別,GCC不會執行任何優化,並且會以最直接的方式編譯源代碼可能。源代碼中的每個命令都將直接轉換為可執行文件中的相應指令,而無需重新排列。這是調試程序時最好的選項,如果未指定優化級別選項,則為默認選項。

  • O1或-O
    此級別打開了最常見的優化形式,這些形式不需要任何速度-空間折衷。使用此選項,生成的可執行文件應該比使用-O0的文件小且速度更快。在此級別上不使用更昂貴的優化,例如指令調度。使用選項-O1進行編譯通常比使用-O0進行編譯要花費更少的時間,這是因為經過簡單優化後需要處理的數據量減少了。

  • O2
    除了-O1使用的優化之外,此選項還會打開其他優化。這些其他優化包括指令調度。僅使用不需要任何速度空間折衷的優化,因此可執行文件的大小不應增加。與-O1相比,編譯器將花費更長的時間來編譯程序並需要更多的內存。通常,此選項是部署程序的最佳選擇,因為它在不增加可執行文件大小的情況下提供了最大的優化。這是GNU軟件包發行版的默認優化級別。

  • O3
    除了所有較低級別的-O2優化外,該選項還啟用更昂貴的優化,例如函數內聯和-O1。 -O3優化級別可以提高生成的可執行文件的速度,但也可以增加其大小。在某些不利於這些優化的情況下,此選項實際上可能會使程序變慢。

  • 操作系統
    此選項選擇優化以減少可執行文件的大小。此選項的目的是為受內存或磁盤空間限制的系統生成盡可能小的可執行文件。在某些情況下,由於更好的緩存使用率,較小的可執行文件也將運行得更快。

+1最好告訴編譯器使您的代碼變大/變快或變小/變慢,而不是像不必要的展開循環之類的事情。
CaseyS
2014-03-19 07:02:14 UTC
view on stackexchange narkive permalink

通常來說,越小越好。但是,有一點會變得太小,實際上會使程序運行緩慢。將其刪除並放入函數中,不僅使程序更小,而且更易於閱讀。

在編譯期間,幕後還進行了一些優化,因此,即使C / C ++代碼看起來很大,編譯器/鏈接器也有可能確定某些重複項並將其合併...或者至少我以前使用過的AVR編譯器無法記住Arduino是否這樣做。

我相信它確實有一些優化... Arduino IDE使用avr-gcc進行編譯。
將重複的代碼放入一個函數中還使得只有一段代碼提供了犯錯的機會,而只有一個地方可以修復它。當您需要更改某些內容時,也只有一個地方可以在以後進行更新。
AMADANON Inc.
2015-01-20 08:34:29 UTC
view on stackexchange narkive permalink

在考慮優化時,請仔細考慮哪些資源最有價值。

您可以針對代碼大小進行優化;這將使您在處理器上添加更多代碼。其餘空間將用於什麼?如果您的代碼不適合您的arduino,而您的選擇是購買更大的芯片,那麼這是值得的。

您可以優化速度-您可以以相同的數量運行更多代碼時間。如果您每秒採樣一次數據,然後在其餘時間休眠,那麼這將無濟於事。

您可以針對功耗進行優化-如果使用電池,則非常重要,而使用電池則不那麼重要如果您使用主電源。這可能不僅是arduino消耗的功率,還可能是傳感器&電機的功率-它們可以關閉一會兒嗎?

許多程序員忘記了兩項優化-針對開發時間進行了優化,

對某件事的任何優化都會趨向於對至少另一件事(通常是幾件事)進行去優化。如果您不知道哪種優化最有用,那麼請考慮可讀性,然後考慮開發時間(因為今天的可讀性=明天的開發時間x 10!)

通常,最昂貴的東西是開發時間(即您的時間,尤其是在為客戶服務的時候)。大多數其他優化都有一個閾值-只要您超過(低於?)特定閾值,進一步的優化就無濟於事。代碼大小和執行速度(在競爭任務之間共享時除外)是這樣的-如果您的代碼適合芯片,那麼它就足夠小了。如果以後需要執行其他操作,則可以對其進行優化。如果您的程序可以做所有需要做的事情(假設它是實時的;計算Pi是不同的情況),那麼它就足夠快了。

Mud
2014-03-20 02:38:42 UTC
view on stackexchange narkive permalink

您的重構應該僅僅因為它是更好的代碼而已,而不是因為它更小。優點是修改起來更容易。

如果減小代碼大小會導致清晰度下降(在您的情況下不是這樣),那麼您應該將其視為過早優化

JRobert
2014-04-07 05:40:00 UTC
view on stackexchange narkive permalink

當您的時間所擁有的價值超過所能獲得的價值時,請停止優化。

您是否正在為某個有薪人而寫作?那應該是他們的電話。但是在這種情況下,代碼的可讀性和清晰度至關重要。有一天,在您不在的情況下,其他人將不得不修改您的代碼。如果您交付了其他人無法閱讀和使用的有效的高性能代碼,則您將不會履行您的義務(除非特別同意)。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...