Re: [討論] 寫三元判斷式code review被打槍
※ 引述《unixxxx (皓皓)》之銘言:
: 標題: Re: [討論] 寫三元判斷式code review被打槍
: 時間: Sat Dec 17 03:51:38 2022
: 很多Javascript 高手都是用 switch 取代
"特定"情況下的確是好方式
舉個例子 以前我在調校能時候有用過這種方式 這是c#的code部分節錄
void Mem_w(ushort address, byte value)
{
if (address < 0x2000) NES_MEM[address & 0x7ff] = value;
else if (address < 0x4020) IO_write(address, value);
else if (address < 0x6000) MapperRouterW_ExpansionROM(address,value);
else if (address < 0x8000) MapperRouterW_RAM(address, value);
else MapperRouterW_PRG(address, value);
}
這個是一個非常頻繁被呼叫的method 如果address 大於等於0x8000
其實前面就浪費好幾次計算在判斷式上
因此改成 功能上是相等的
static void Mem_w(ushort address, byte value)
{
switch (address & 0xf000)
{
case 0:
case 0x1000:
NES_MEM[address & 0x7ff] = value;
break;
case 0x2000:
case 0x3000:
case 0x4000:
IO_write(address, value);
break;
case 0x5000:
MapperObj.MapperW_ExpansionROM(address, value);
break;
case 0x6000:
case 0x7000:
MapperObj.MapperW_RAM(address, value);
break;
case 0x8000:
case 0x9000:
case 0xa000:
case 0xb000:
case 0xc000:
case 0xd000:
case 0xe000:
case 0xf000:
MapperObj.MapperW_PRG(address, value);
break;
}
}
但再簡化快速下去還有大招
初始化執行一次就好
static void init_function()
{
mem_write_fun = new Action<ushort, byte>[0x10000];
for (int address = 0; address < 0x10000; address++)
{
if (address < 0x2000) mem_write_fun[address] =
new Action<ushort, byte>((addr, val) => { NES_MEM[addr & 0x7ff] = val; });
else if (address < 0x4020) mem_write_fun[address] =
new Action<ushort,byte>(IO_write);
else if (address < 0x6000) mem_write_fun[address] =
new Action<ushort, byte>(MapperObj.MapperW_ExpansionROM);
else if (address < 0x8000) mem_write_fun[address] =
new Action<ushort, byte>(MapperObj.MapperW_RAM);
else mem_write_fun[address] =
new Action<ushort, byte>(MapperObj.MapperW_PRG);
}
}
之後讀取
[MethodImpl(MethodImplOptions.AggressiveInlining)]
static void Mem_w(ushort address, byte value)
{
mem_write_fun[address](address, value);
}
實際上跟switch原理很相似 但直接把mapper的實作 哪個address對應啥動作
直接寫到記憶址array去了
我是不知道你所謂的javascript高手用switch替代判斷式是碰到啥議題
但特定議題用改用switch 甚至自己刻死路由效能是會快非常多
以前有筆記在這邊...
https://dotblogs.com.tw/enet/2017/01/21/emu_optimization_1
--
...
快不快還是 benchmark 或看編譯出來什麼東西吧
有用FPS測過 提升很大 看到前面有人推文提到 ARRAY LOOKUP最快 其實就是這種方式
※ 編輯: erspicu (39.15.64.117 臺灣), 12/26/2022 23:52:39推
好奇問 為什麼這裡switch-case會比多重if-else快?
以及 為什麼這裡用function map比switch-case快?
如果頻繁判斷address大於等於0x8000 那這判斷放前面
沒人知道 ADDRESS到底是落在哪個區間多 這就問題
為什麼不會是個好的解法?
這不是大一計概就會教的 if else 是循序判斷 switch 是ju
mp map是hash 但是好的compiler可以直接最佳化if else
抱歉 我比較沒有計概常識
最終結果其實是多重因素下複合產生的 所以與其問為什麼 最快其實就是跑看看才準 當然要從理論層出發談談也不是不行 但談理論有時候實際就會是出乎意料 至於 if else -> switch -> array lookup case多時候為啥比較快 循序判斷本身就是計算成本 至於switch跟array lookup其實精神上是類似做法 就一個查表動作 不過還是得實際測一下 有時候這也跟實際case有關係 就所處電腦硬體條件 如果RAM慢到一個程度 慢到一次查表 乾脆讓CPU去完成幾次計算 還比一次查表快 那就用if else 後來發現一切理論都沒那麼可靠 要考量的太多 實測就知道答案 而且實測的答案 說不定在不同硬體條件下又是別的狀況 C#會輸出IL CODE看IL CODE也不太準 看JIT編譯出的東西才知道真正做啥事情 知道真正做啥事情 有時候也要考慮到硬體差異 查表法說白了就是先將答案算出來記錄下來 直接查 是存取記憶體ARRAY的COST 計算量大時候 先算計下來會比較快 但如果記憶體存取的COST高於重算幾次的CPU計算 那乾脆就重算一次.... 這些都不是非常一定 直接測一測是最好的方式 剩下都紙上談兵 意料之外的結果會常常發生
看來原PO用的是沒那麼好的compiler :(
微軟在C#輸出的優化應該已經是標竿了
※ 編輯: erspicu (39.15.64.117 臺灣), 12/27/2022 12:48:33單純補充一下,這應該不適合在C. 剛用gcc 看組語內容,
switch 仍然用比較且跳躍來實作
其實就像前面說的 真的都要實際跑看看才準或是看到ASM層去才比較有意義 沒有一定的萬用通則
你下面陣列開了六萬多個再用for去跑,真的需要那麼多個?
因為你的case只有五種,要不要數字進來都/5,這樣較省空間
就算是C 還可以問你優化編譯有沒有開
這種其實沒甚麼好討論的 就算真的這樣做有用 也只是單
一case適用 另外 profiling的情況是有規定的 不是隨便
跑 上次不知道哪個人開debug mode做profiling 原本想說
甚麼 後來想想還是算了
打錯 我是指開IDE去run程式做profiling
開IDE跟profiling是之間沒有關係,除非開debug build
chuegou, 我用gcc -O0跟-O3測試.你也可以自己試試看
95
首Po小弟寫java的 以前常常寫三元判斷式 就比如說 String a; if(con) {18
三元不能用 算還好了 我還遇過 a=1; ... ...11
Code review 檢查這些會有點太花時間,應該有更重要的東西要看。 可以用一些 Gradle plugins 卡在 CI 比較省事: 1. Checkstyle 顧名思義檢查 style。 2. SpotBugs12
從 C++ 的角度來說 三元運算子有機會改變 l-value/r-value 的性質,進而破壞最佳化 舉個簡單例子 可以看到用三元運算子的時候,回傳區域變數竟然要 copy 而不是 move 雖然說 Java 沒有這些5
沒有 沒有什麼公認 要解決coding style 最好的辦法就是CTO大頭召集全部RD開會 把這間公司的coding style全都記下來8
這種事情 不就和阿里巴巴一樣 一開始給大家一本手冊 哪些code 或是哪些style在本公司不要出現1X
隨著語法的進步 很多會寫 code 的人都很少寫判斷式了 不管是三元還是 if else 寫太多的判斷式 如果….所以…否則…如果….則又…如果..24
說到switch,想來問問你各位公司的code style是下面哪種 (1) switch Var1 { case a: xxx5
好啦 假設不是反串 我覺得滿有道理的 但有一點其實你說錯了 其實並不是語法進步 之前學 Rust 覺得哇 pattern matching 真是他媽神 好潮喔 後來跑去學 OCaml 我才發現(Rust設計者是OCaml粉 一開始的compiler就是用OCaml寫)
40
[問卦] 程式能寫if 就不要用for loop?以前寫程式覺得要看起來厲害 明明能用if的 我會先建一個table 然後再用for loop尋找 好處是數量增加時增加的程式碼少 壞處是寫的時候和以後回來看的時候比較麻煩20
Re: [北美] Leetcode刷起來 分享刷題之我見我把自己寫的400題都弄成PDF了 我是用C++的 需要的人可以私信給我 謝謝 請附上你的email address 拿到後如果覺得有幫助 煩請做一件善事作為回報 不一定要捐錢啥的 扶老太太過馬路也可以13
Re: [情報] PS購買巫師3連動GOG可得到GOG版巫師3從STEAM板H大推文看到的國外論壇的解法 1.關閉GOG Galaxy程式 2.登錄進網頁版PSN 3.點開 會出現 {"npsso":"xxx"}的東西,xxx 是你的npsso value12
Re: [討論] 請大家聊聊 JavaScript的缺陷我覺得Javascript最大的問題是它是prototype語言,大家不習慣,尤其從class based語言來的人。 像我上禮拜在看web component的時候,看不懂一段程式。 if (this.hasOwnProperty(prop)) {