我有一个在Linux上运行的C++应用程序,我正在优化它.如何确定代码的哪些区域运行缓慢?
Levenshtein在C#和F#中的实现.对于两个大约1500个字符的字符串,C#版本快10倍.C#:69 ms,F#867 ms.为什么?据我所知,他们完全一样吗?无论是Release还是Debug构建都无关紧要.
编辑:如果有人来这里专门寻找编辑距离实施,它就会被打破.工作代码在这里.
C#:
private static int min3(int a, int b, int c)
{
return Math.Min(Math.Min(a, b), c);
}
public static int EditDistance(string m, string n)
{
var d1 = new int[n.Length];
for (int x = 0; x < d1.Length; x++) d1[x] = x;
var d0 = new int[n.Length];
for(int i = 1; i < m.Length; i++)
{
d0[0] = i;
var ui = m[i];
for (int j = 1; j < n.Length; j++ )
{ …Run Code Online (Sandbox Code Playgroud) 我正在尝试将Haskell核心库的Arrows转换为F#(我认为这对于更好地理解Arrows和F#是一个很好的练习,我可能能够在我正在开发的项目中使用它们.)但是,直接翻译由于范式的不同,是不可能的.Haskell使用类型类来表达这些东西,但我不确定F#构造最好用F#的习语映射类型类的功能.我有一些想法,但最好把它提到这里,看看哪些被认为是最接近的功能.
对于tl; dr crowd:我如何将类型类(一个Haskell成语)翻译成F#惯用代码?
对于那些接受我长篇解释的人:
来自Haskell标准库的代码是我正在尝试翻译的一个例子:
class Category cat where
id :: cat a a
comp :: cat a b -> cat b c -> cat a c
class Category a => Arrow a where
arr :: (b -> c) -> a b c
first :: a b c -> a (b,d) (c,d)
instance Category (->) where
id f = f
instance Arrow (->) where
arr f = f
first f = f *** id
Run Code Online (Sandbox Code Playgroud)
尝试1:模块,简单类型,让绑定
我的第一个镜头是直接使用模块组织来映射事物,例如:
type Arrow<'a,'b> …Run Code Online (Sandbox Code Playgroud) 我正在研究一些重的cpu绑定问题.当我使用inline关键字时,我看到了很大的性能提升.我从标准.net库创建一个字典,传入自定义密钥Comparer,请参阅下面的代码和时序结果
https://gist.github.com/4409734
在Eq_cmp上没有内联关键字
> perf_run 10000000 ;;
Real: 00:00:11.039, CPU: 00:00:11.029, GC gen0: 771, gen1: 3, gen2: 1
val it : unit = ()
Run Code Online (Sandbox Code Playgroud)
在Eq_cmp上使用内联关键字
perf_run 10000000 ;;
Real: 00:00:01.319, CPU: 00:00:01.388, GC gen0: 1, gen1: 1, gen2: 1
val it : unit = ()
>
Run Code Online (Sandbox Code Playgroud)
我还注意到Gen 0 GC与内联代码和非内联代码的巨大差异.
有人可以解释为什么会有这么大的差异吗?