Если использовать Haskell в качестве библиотеки, называемой из моей программы на C, каково влияние производительности на вызовы? Например, если у меня есть набор данных мировых проблем, скажем, 20 кбайт данных, и я хочу запустить что-то вроде:
// Go through my 1000 actors and have them make a decision based on
// HaskellCode() function, which is compiled Haskell I'm accessing through
// the FFI. As an argument, send in the SAME 20kB of data to EACH of these
// function calls, and some actor specific data
// The 20kB constant data defines the environment and the actor specific
// data could be their personality or state
for(i = 0; i < 1000; i++)
actor[i].decision = HaskellCode(20kB of data here, actor[i].personality);
Что будет происходить здесь - будет ли у меня возможность хранить эти 20 кбайт данных в качестве глобальной неизменяемой ссылки где-то, к которой обращается код Haskell, или мне нужно каждый раз копировать эти данные?
Угроза состоит в том, что эти данные могут быть большими, намного большими - я также надеюсь написать алгоритмы, которые действуют на гораздо более крупные наборы данных, используя тот же шаблон неизменяемых данных, который используется несколькими вызовами кода Haskell.
Кроме того, я хотел бы распараллелить это, например, dispatch_apply() GCD или Parallel.ForEach(..) С#. Мое объяснение для распараллеливания вне Haskell заключается в том, что я знаю, что я всегда буду работать со многими отдельными вызовами функций, то есть 1000 участников, поэтому использование мелкозернистого распараллеливания внутри функции Haskell не лучше, чем управление им на уровне C. Является ли запуск экземпляров FFI Haskell "Thread Safe" и как мне это достичь - нужно ли инициализировать экземпляр Haskell каждый раз, когда начинаю параллельный запуск? (Кажется медленным, если я должен...) Как я могу достичь этого с хорошей производительностью?