Я пишу очень интенсивную по производительности программу и использую C, но кто-то сказал мне, насколько круто функциональное программирование, поэтому я решил переписать его на F #.
В любом случае, особая функция, которую мне сложно воспроизвести в F #, - это устройство Даффа . Вместо типичной итерации он разматывает цикл, поэтому он может копировать 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 #, что я могу использовать, чтобы сделать кейс падением и перейти в середину цикла? Если вы можете сделать это для меня, я думаю, что смогу выяснить все остальное.