Если я хочу вызвать более одной функции C, каждая из которых зависит от результата предыдущей, лучше ли создать функцию C-оболочки, которая обрабатывает три вызова? Будет ли это стоить так же, как с использованием Haskell FFI без преобразования типов?
Предположим, что у меня есть следующий код Haskell:
foo :: CInt -> IO CInt
foo x = do
a <- cfA x
b <- cfB a
c <- cfC c
return c
Каждая функция cf*
является вызовом C.
Лучше ли с точки зрения производительности создать одну C-функцию типа cfABC
и сделать только один внешний вызов в Haskell?
int cfABC(int x) {
int a, b, c;
a = cfA(x);
b = cfB(a);
c = cfC(b);
return c;
}
Код Haskell:
foo :: CInt -> IO CInt
foo x = do
c <- cfABC x
return c
Как измерить стоимость исполнения вызова C от Haskell? Не стоимость самой функции C, а стоимость "переключения контекста" с Haskell на C и обратно.