让生锈变得越快越好

2020-05-03 21:33:13

围棋是垃圾收集的,铁锈不是。这意味着生锈比走快,对吗?不!不总是这样。

让我们来看一个例子,我在使用一个计算Levenshtein编辑距离的算法时偶然发现了这个例子。我想比较相同算法在几种不同语言中的性能。这些语言中有两种是“锈迹斑斑”和“走人”。

令我惊讶的是,围棋版本比铁锈版本快。快多了。我最初的反应是,我一定是不正确地实现了铁锈版本。也许我在围棋里做了一些不安全(但速度很快)的事情,但生锈不让我做。为了解释这一点,我制定了一些基本规则:

习惯用法越多越好。例如,Rust承诺零成本抽象,因此我们应该依靠它来编写安全代码(&;W)。

没有静态全局变量。这意味着需要对容器进行堆分配&动态调整大小。我们不知道投入会有多大!

简而言之,这应该是您乐意交付给Prod的代码。这是我最终得到的结论:

func EditDistance(source,target string)int{if len(Source)==0{return len(Target)}if len(Target)==0{return len(Source)}sourceChars:=[]rune(Source)targetChars:=[]rune(Target)cache:=make([]int,len(Target)+1)for i:=0;i<;len(Target)+1;i++{cache[i]=i}for i,sourceChar:=range sourceChars{nextDist:=i+1 for j,targetChar:=range targetChars{currentDist:=nextDist DistIfSubstitutes:=cache[j]ifsourceChar!=targetChar{DistIfSubstituty++.