我在寫一個非常性能強勁的程序,並且一直在使用C,但有人告訴我函數式編程有多酷,所以我決定用F#重寫它。如何在F#中寫Duff的設備?
無論如何,我在F#中難以複製算法的特定函數是Duff's device。它不是典型的迭代,而是展開循環,以便每次迭代可以複製8個字節,而不是一個。
void copy_memory(char* to, char* from, size_t count) {
size_t n = (count+7)/8;
switch(count%8) {
case 0: do{ *to++ = *from++;
case 7: *to++ = *from++;
case 6: *to++ = *from++;
case 5: *to++ = *from++;
case 4: *to++ = *from++;
case 3: *to++ = *from++;
case 2: *to++ = *from++;
case 1: *to++ = *from++;
}while(--n>0);
}
}
這種利用情況下通,並跳轉至C,其中,據我所知,是不幸的特點是F#似乎缺少一個循環的中間的能力。
我讀了一些MSDN上的東西,並認爲F#的match
功能將是我可以最接近C的switch
。所以,我開始寫這段代碼
open System.Reflection
let copyMemory (pTo : Pointer) (pFrom : Pointer) length =
let n = (length + 7)/8
match n % 8 with
| 0 ->
然後我無法弄清楚該怎麼做。它不會讓我在這裏開始一個循環,並在另一個案例中結束它。
F#中有什麼東西可以用來做案例轉場並跳到循環的中間嗎?如果你能爲我做到這一點,我想我可以自己找出其他的。
祝你好運...我想你必須直接發出IL代碼;) – fmr
Duff的設備在功能語言或任何現代編譯器中都沒有意義,因爲它們會優化像這樣給你,如果它是有道理的。 –
我意識到我的第二個努力是越野車,所以我用更忠實的達夫的翻譯來代替它。 – Daniel