簡體   English   中英

編程語言中不同結構的速度(Java/C#/C++/Python/...)

[英]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 的微優化是

  • 非常困難
  • 大多是徒勞的
  • 通常與 10 多年前的“優化”相反。

總之,首先編寫可讀的代碼。 當您確實遇到性能問題時,請先進行分析和衡量。

作為應用程序開發人員,您應該擔心使用正確的算法,例如不要讀取超出需要的集合等。但是在指令/語句級別上,您之間有太多層(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 << 2a <<= 2只會對沒有運算符重載的普通整數執行相同的操作。

在所有提到的語言(Java 除外)中,您可以輕松添加運算符 oveload,並且這些形式中的每一種都可以產生完全不同的結果。 如果您正在使用整數並且后來決定使用浮點數,則某些運算符可能會出現問題,因為它們未定義( <<<<= )等。

另一方面,在純整數的情況下,許多形式可能會生成完全相同的機器代碼。 在某些平台上,機器代碼根本不涉及乘法或左移——例如,x64 上的 c++ 編譯器傾向於在所有情況下生成lea eax, [4*rdi] 所以編譯器會比你聰明。

暫無
暫無

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

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