Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在使用接口时,如何从Go获得最大性能?_Go - Fatal编程技术网

在使用接口时,如何从Go获得最大性能?

在使用接口时,如何从Go获得最大性能?,go,Go,我在一个模拟器上工作,每个指令都很重要。我们之所以被吸引是因为接口抽象,但从基准测试来看,调用接口的间接寻址要比直接调用方法差5倍。然而,我们的项目结构现在依赖于使用接口来绕过循环依赖关系。有没有一种方法可以使接口更快(值得怀疑),或者绕过没有接口的循环依赖关系?如果您看到循环依赖关系,这表明您的代码在单独的模块中。将所有代码移到单个模块中。那么你就不需要接口了。模块通常是围棋中相当大的分组。不要仅仅为了代码组织而创建它们。首先,坏消息是,接口的速度与现在一样快,可能会提高1.7,但不会太多 如

我在一个模拟器上工作,每个指令都很重要。我们之所以被吸引是因为接口抽象,但从基准测试来看,调用接口的间接寻址要比直接调用方法差5倍。然而,我们的项目结构现在依赖于使用接口来绕过循环依赖关系。有没有一种方法可以使接口更快(值得怀疑),或者绕过没有接口的循环依赖关系?

如果您看到循环依赖关系,这表明您的代码在单独的模块中。将所有代码移到单个模块中。那么你就不需要接口了。模块通常是围棋中相当大的分组。不要仅仅为了代码组织而创建它们。

首先,坏消息是,接口的速度与现在一样快,可能会提高1.7,但不会太多

如果您的接口不是庞大的,那么可以传递func而不是接口

例如:

func Sort(a sort.Interface) // can be rewritten as
func Sort(ln int, lessFn func(i, j) bool, swapFn func(i, j))

但我100%同意@RobNapier.

Hmmm。。。我们本来就有这个,但将项目中的每个文件都保存在一个文件夹中似乎很无组织。目前我们已经有50多个文件,不包括测试文件。此外,我们项目的某些部分在逻辑上是独立的。有没有办法在维护单个软件包的同时创建子文件夹?没有。请将它们放在一个文件夹中。模块不是代码组织工具。它们是一种代码重用工具。在Go中,在一个目录中有许多文件是完全正常的。您还可能使文件太小。您不需要或不希望每种类型都有一个文件。您认为适用于目录的内容实际上可能适用于Go中的文件。文件是自然的代码组织工具。@creker我不知道你在说什么。1.您可以在C、C++或1.7 FordRy中编写您的热代码,并从CGO调用它。2.您可以在汇编中编写。3.有很多方法可以围绕gc进行优化。4.go1.7(当前提示)优化器变得更好了。例如,我的纯go-xxhash包比现在使用go 1.7优化器的C版本快。我们目前正试图从go中获得尽可能多的信息,因为GC是我们项目的一大优势。我们已经研究了cgo和汇编语言的编写,这两种语言都很慢,因为上下文切换太频繁,例如,在C语言中没有足够的时间。我们希望研究Go的可维护性和它的强类型。我们知道Go并不是性能的最佳选择,但它的其他特性值得我们探讨一下我们能获得多高的性能。@creker我同意。另外,我并不是建议避免使用包,而是仅仅为了“代码组织”而避免使用包。如果每个小组件都放在不同的包中,那么您必须开始在需要它们的地方导入它们,并使用
package.Identifier
引用导出的标识符,而不仅仅是
Identifier
。这是为了“代码组织”而有许多包的一个小结果。谢谢!这是个好主意。特别是如果你把函数做成自己的类型,它真的会快很多吗?仍然存在间接寻址,这些函数无法内联。@kostya嗯,这取决于go 1.6(当前版本),它比当前git快约25%,尽管它只快约2%。