為什麼Leetcode中C#運行速度比python還慢?

左邊是python,右邊是C#,按道理來說,編譯型語言應該比腳本語言快很多啊,比如同樣這道題,C++和Java就要比python快很多,但C#卻慢的離譜,這是為什麼??


可能是因為用C#的人少,人家背後又有集群,所以每次都冷起動(逃

如果後台一上來就先把.net core跑起來,然後再餵給他具體的assembly,會巨快無比。


LeetCode的時間你看著樂樂就好,別當真。當初Java也是特別慢,So what?


可能是Mono不給力,也可能是:.NET程序在第一次運行時,JIT會嘗試先將MSIL代碼儘可能地編譯為Native代碼,這個過程導致了看上去運行速度較慢。

我刷LeetCode的時候全程用C#,每道題都是在300ms以上,所以就和C#的答案比比就好=。=


大概是 C# 的 JIT 不給力,而且 JIT 相對於解釋執行在性能上的優勢來源於長時間運行。

另外對於 OJ 這種沙盒,因為存在許可權問題,對於這種短時間運行的程序,不同的執行方式開銷差距也是比較大的。比如 A+B - 51Nod 這種題目,直接使用「受限用戶」使用 JOB 啟動目標程序大概 100+ms,而高許可權用戶使用 CreateProcessWithLogonW + JOB 啟動目標程序至少 300+ms。


我測試了很多道題,java和C#相同的演算法,結果java比C#快4-5倍,但是我在自己的電腦上跑,C#比java平均快50%,我估計他編譯的時候用的是debug

mono我也測試過,不過是最新的mono 4.2,也要比java快,leetcode這個絕對有問題


用的Mono,本來就慢,另外編譯還了 debug開關,不慢就奇怪了。


之前有人回答過類似的問題,leetcode不是比較編程語言速度的,是把編程語言當做一個定量,比較演算法速度的。不同語言因為計算方式的不同,數據量不同,肯定是不能來比較的。


十有八九Mono的問題嘍? 估摸著跑C#連同Compile的時間也給算上了。


推薦閱讀:

如何在C#中實現返回類型由參數決定的函數?
如何實現 Call / CC 或者陰陽謎題(Yin Yang Puzzle)?
是否Future/Promise模式 能實現的FRP都能更好的實現?
如何將MATLAB轉化為C#?
如何看待2017的 The .NET Language Strategy 去掉了C++/CLI支持?

TAG:Python | 演算法 | C# | LeetCode |