[英]Speed of different constructs in programming languages (Java/C#/C++/Python/…)
我的老板剛剛告訴我,他從一本書中學到了快速 VB6 算法,並且編寫東西的最短方法不一定是最快的(例如,內置方法有時比自己編寫的方法慢得多,因為它們會進行各種檢查或 unicode 轉換在您的情況下可能不需要)。
現在我想知道,是否有一個網站提供各種語言的快速不同結構的信息,尤其是。 Java/C#/Python/...(也是 C++,但有很多編譯器,它們可能有很大不同)。
例如,兩者之間有區別嗎
if (a()) b();
和
a() && b();
另一個例子: a = a * 4
可以編譯為與a <<= 2
相同的代碼?
當然,我可以自己測試一下,同時編寫它們,然后將它們運行 100000 次並比較運行時,但我也想了解編寫東西的新方法,甚至可能是我以前沒有考慮過的東西。 感謝您的回答!
if (a()) b();
之間有區別嗎if (a()) b();
和a() && b();
?
是的,可讀性。 第一個更清楚地說明了意圖。
a = a * 4
可以編譯為與a <<= 2
相同的代碼?
很可能是的。 但即使它們最終成為不同的 CPU 指令,時間差異也會非常小,並且取決於前后的指令。
現代 CPU 的微優化是
總之,首先編寫可讀的代碼。 當您確實遇到性能問題時,請先進行分析和衡量。
作為應用程序開發人員,您應該擔心使用正確的算法,例如不要讀取超出需要的集合等。但是在指令/語句級別上,您之間有太多層(C# 編譯器、IL 編譯器、優化器、流水線 CPU)以及實際執行的內容。
不要被這種微優化所困擾。 他們不會在性能方面給你任何東西。
如果您有性能問題,請找到瓶頸並對其進行優化。
始終盡最大努力創建良好、干凈、高效的代碼。 這可能意味着微優化(比如使用 stringbuilder 而不是添加字符串,如果不需要就不要使用正則表達式,諸如此類,不要聽那些說這些毫無意義的人:如果你寫的代碼不好,不要甚至不在乎,JITter 不會幫助您)或瓶頸優化(不要從整個表中選擇 *,使用多線程)。 托管環境將完成剩下的工作。 CPU 密集型代碼永遠不會像非托管代碼那樣高效,但也有許多優點,這就是大多數人喜歡使用它們的原因。 如果您想要真正快速的代碼片段,請使用 C、匯編或硬件來編寫。 今天的大多數業務應用程序都不是 CPU 密集型的,如 GUI、Web 服務、數據庫、磁盤使用,它們都涉及大量等待和空閑的 CPU。
至於你的問題: if (a()) b(); 和 a() && b(); 完全一樣,這里沒有優化。 a * a和a<<2不一樣,后者是a*4。
這是一個非常古老的問題,但也有一個方面,沒有人提到:
運算符重載
a *= 4
, a = a * 4
, a = a << 2
和a <<= 2
只會對沒有運算符重載的普通整數執行相同的操作。
在所有提到的語言(Java 除外)中,您可以輕松添加運算符 oveload,並且這些形式中的每一種都可以產生完全不同的結果。 如果您正在使用整數並且后來決定使用浮點數,則某些運算符可能會出現問題,因為它們未定義( <<
、 <<=
)等。
另一方面,在純整數的情況下,許多形式可能會生成完全相同的機器代碼。 在某些平台上,機器代碼根本不涉及乘法或左移——例如,x64 上的 c++ 編譯器傾向於在所有情況下生成lea eax, [4*rdi]
。 所以編譯器會比你聰明。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.