精華區beta Programming 關於我們 聯絡資訊
※ 引述《freaky.bbs@ptt.cc (jon)》之銘言: > 所以你的論點是比較的時候只有 unmanaged code 是微調到最佳化的情況, > managed code 就不能在最佳情況下嗎?前面也提了 .net 有 NGen.exe > (Native Image Generator) 可以在 deployment 的時候做,就沒有什麼 > 每次執行碰運氣的問題,但實際使用上未必每次都會比讓 CLR 自行調整的 > 的效能好。C# 的 source compiler 有一些最佳化沒做,所以請你去使用 > C++/CLI,如果你願意嘗試再討論吧。 我倒是覺得 NGen 對 .NET 來說是一把雙面刃, 不要忘記 .NET 程式經過 NGen 處理過以後, 傳統 compiler 沒辦法在 runtime 做到的即時最佳化, 也會變得無法進行了, 因為它算是一種 Pre-JIT 的做法, 而且就我的印象中, 使用 NGen 依然不能刪除原本帶有 IL 的程式, 這代表在執行時還是會有參考它的可能性, 不過這一點我並不是很確定。 IL -> NGen -> native 還有一個致命的問題存在, IL 這種東西在設計上有兩種目的: 1. 為了進行更多最佳化而設計 2. 為了方便執行而設計 我接觸 C# 的期間有小小研究過 .NET 的 IL, 它很顯然是屬於後者的, 而傳統 compiler 能夠設計多層次的 IL, 將那些對最佳化有利的高階資訊(接近原始程式語言的資訊)保留下來, 近期很多 compiler 的產品都會有 back-end 往 front-end/middle-end 的 upcall, 原因也是在此, 而 .NET 的 IL 和 Java 的 bytecode 都不具備這種特性, 因此透過 NGen 所能做到的最佳化相當有限。 至於 C++/CLI 我應該是不可能主動去學它, 畢竟把 C++ syntax 惡搞成那樣讓我蠻反感的, 不過一旦有人丟出 C++/CLI v.s. 傳統 C++ 的 benchmark, 而且結果是 C++/CLI 比較好的時候, 我就會馬上去抓來實際測試看看。 就像我之前雖然不喜歡 Java, 但是一有人丟出 Java faster than C++ benchmark, 我還是會跑去破解它一樣。 > C++ 的確可以自行撰寫 custom allocator 來配置記憶體,不過又回到老問題了, > unmanaged code 什麼事都可以做,要寫出一個不會有 heap fragmentation > 的 allocator 是有實際上的困難的,最佳化也是,對於無從預測的行為要如何 > 最佳化? 雖然 unmanaged code 什麼事都可以做, 但是我們不能假設 programmer 都是笨蛋, 何況即使是在非 .NET 的環境, 一樣存在著所謂的 framework, 而在那套 framework 下所定義的遊戲規則, programmer 並不會任意的去違背它, 其實規模也不需要大到 framework, 只要選用的 memory allocator 訂出一套遊戲規則, 使用它的 programmer 本來就該遵守。 而 heap manager 這種東西在 unmanaged code 裡, 還可以由 programmer 視實際需求抽換, 所以這一點不但不是效能上的不利因素, 還是彈性上的有利因素。 -- Name: Tseng, Ling-hua E-mail Address: uranus@it.muds.net School: National Chung Cheng University Department: Computer Science and Information Engineering Researching: Porting GCC and Implementing VLIW instruction scheduler in GCC Homepage: https://it.muds.net/~uranus -- ╔═══╗ ┼────────────────────────╮ 狂狷 Origin:[ 狂 狷 年 少 ] whshs.cs.nccu.edu.tw ╰─╮ 年少 ┼╮ < IP:140.119.164.16 > ╰─╮ ╚╦═╦╝ From:218-171-137-182.dynamic.hinet.net ─╨─╨─ KGBBS 遨翔"BBS"的狂狷不馴;屬於年少的輕狂色彩