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
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 39.15.64.117 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1672067047.A.133.html
※ 編輯: erspicu (39.15.64.117 臺灣), 12/26/2022 23:04:55
※ 編輯: erspicu (39.15.64.117 臺灣), 12/26/2022 23:13:24
→
12/26 23:47,
1年前
, 1F
12/26 23:47, 1F
→
12/26 23:48,
1年前
, 2F
12/26 23:48, 2F
有用FPS測過 提升很大 看到前面有人推文提到 ARRAY LOOKUP最快
其實就是這種方式
※ 編輯: erspicu (39.15.64.117 臺灣), 12/26/2022 23:52:39
推
12/27 00:01,
1年前
, 3F
12/27 00:01, 3F
推
12/27 06:32,
1年前
, 4F
12/27 06:32, 4F
推
12/27 06:48,
1年前
, 5F
12/27 06:48, 5F
→
12/27 06:50,
1年前
, 6F
12/27 06:50, 6F
推
12/27 06:55,
1年前
, 7F
12/27 06:55, 7F
沒人知道 ADDRESS到底是落在哪個區間多 這就問題
→
12/27 06:56,
1年前
, 8F
12/27 06:56, 8F
推
12/27 06:58,
1年前
, 9F
12/27 06:58, 9F
→
12/27 06:58,
1年前
, 10F
12/27 06:58, 10F
推
12/27 07:01,
1年前
, 11F
12/27 07:01, 11F
最終結果其實是多重因素下複合產生的 所以與其問為什麼 最快其實就是跑看看才準
當然要從理論層出發談談也不是不行 但談理論有時候實際就會是出乎意料
至於 if else -> switch -> array lookup
case多時候為啥比較快 循序判斷本身就是計算成本
至於switch跟array lookup其實精神上是類似做法
就一個查表動作 不過還是得實際測一下 有時候這也跟實際case有關係
就所處電腦硬體條件 如果RAM慢到一個程度 慢到一次查表
乾脆讓CPU去完成幾次計算 還比一次查表快 那就用if else
後來發現一切理論都沒那麼可靠 要考量的太多 實測就知道答案
而且實測的答案 說不定在不同硬體條件下又是別的狀況
C#會輸出IL CODE看IL CODE也不太準 看JIT編譯出的東西才知道真正做啥事情
知道真正做啥事情 有時候也要考慮到硬體差異
查表法說白了就是先將答案算出來記錄下來 直接查 是存取記憶體ARRAY的COST
計算量大時候 先算計下來會比較快 但如果記憶體存取的COST高於重算幾次的CPU計算
那乾脆就重算一次.... 這些都不是非常一定 直接測一測是最好的方式
剩下都紙上談兵 意料之外的結果會常常發生
→
12/27 07:07,
1年前
, 12F
12/27 07:07, 12F
微軟在C#輸出的優化應該已經是標竿了
※ 編輯: erspicu (39.15.64.117 臺灣), 12/27/2022 12:48:33
→
12/27 13:44,
1年前
, 13F
12/27 13:44, 13F
→
12/27 13:44,
1年前
, 14F
12/27 13:44, 14F
其實就像前面說的 真的都要實際跑看看才準或是看到ASM層去才比較有意義
沒有一定的萬用通則
推
12/27 15:54,
1年前
, 15F
12/27 15:54, 15F
→
12/27 15:56,
1年前
, 16F
12/27 15:56, 16F
※ 編輯: erspicu (39.15.64.117 臺灣), 12/27/2022 19:48:40
推
12/27 22:08,
1年前
, 17F
12/27 22:08, 17F
→
12/27 22:35,
1年前
, 18F
12/27 22:35, 18F
→
12/27 22:35,
1年前
, 19F
12/27 22:35, 19F
→
12/27 22:36,
1年前
, 20F
12/27 22:36, 20F
→
12/27 22:36,
1年前
, 21F
12/27 22:36, 21F
→
12/27 22:38,
1年前
, 22F
12/27 22:38, 22F
推
12/28 12:27,
1年前
, 23F
12/28 12:27, 23F
→
12/28 13:19,
1年前
, 24F
12/28 13:19, 24F
推
12/30 09:37,
1年前
, 25F
12/30 09:37, 25F
→
12/30 09:38,
1年前
, 26F
12/30 09:38, 26F
討論串 (同標題文章)
Soft_Job 近期熱門文章
50
194
15
92
PTT職涯區 即時熱門文章
260
454
69
194