我编写了一个小的C模块来提高性能,但是GHC不会内联外部函数,并且调用成本消除了加速效果。
例如,test.h
:
int inc (int x);
test.c
:
#include "test.h"
int inc(int x) {return x + 1;}
Test.hc
:
{-# LANGUAGE ForeignFunctionInterface #-}
module Test (inc) where
import Foreign
import Foreign.C
foreign import ccall unsafe "test.h inc" c_inc :: CInt -> CInt
inc = fromIntegral . c_inc . fromIntegral
{-# INLINE c_inc #-}
{-# INLINE inc #-}
Main.hs
:
import System.Environment
import Test
main = do {args <- getArgs; putStrLn . show . inc . read . head $ args }
制作:
$ gcc -O2 -c test.c
$ ghc -O3 test.o Test.hs
$ ghc --make -O3 test.o Main
$ objdump -d Main > Main.as
最后,在Main.as
中,我使用了callq <inc>
指令,而不是期望的inc
指令。
llvm-link
组合.bc文件,使用opt
进行优化,然后使用llc
发出可执行代码。 - Mikhail Glushenkovinc
提供一个类型。目前您正在将其转换为整数,这是您的意图吗?那会使 FFI 的开销过大(每次调用约 900 纳秒,如果我没记错的话)。 - Don Stewart-keep-llvm-files
会给出.ll
汇编代码,然后您可以使用llvm-as
进行编译。 - Mikhail Glushenkov