Performance Go、封装和性能
我正在探索的代码:Performance Go、封装和性能,performance,go,compiler-optimization,Performance,Go,Compiler Optimization,我正在探索的代码: type Stack struct { length int values []int } func (s *Stack) Push(value int) { // ... } func (s *Stack) Pop() int { // ... } func (s *Stack) Length() int { return s.length } 方法Push和Pop更改Stackstruct中的length字段。我想对其他文件
type Stack struct {
length int
values []int
}
func (s *Stack) Push(value int) {
// ...
}
func (s *Stack) Pop() int {
// ...
}
func (s *Stack) Length() int {
return s.length
}
方法Push
和Pop
更改Stack
struct中的length
字段。我想对其他文件隐藏这个字段,以防止像stack.length=…
(手动length
更改)这样的代码。但我需要能够读取这个字段,所以我添加了getter方法-Length
我的问题是:
stack.Length()
不应该比stack.Length
慢,因为它是一个函数调用吗?我已经学会了一点汇编语言,我知道程序应该做多少操作来调用一个函数。我的理解对了吗:通过添加getter方法stack.Length()
我保护了那些使用我的lib的人,使他们不会受到不好的使用,但它的代价是程序的性能?这其实不仅关系到去
stack.Length()
不应该比stack.Length
慢,因为它是一个函数调用吗
具体而言:
编译器应该进行内联扩展,除非它使程序运行得更慢。编译器在检测此类减速(如果存在)之前或之后的表现如何,则是另一个问题。在这种特殊情况下,给定函数定义,编译器几乎肯定会直接展开函数,因为访问
stack.length
可能是一条指令,调用函数可能是一条指令,在这里决定折衷将很容易。我向您保证,如果存在差异,则可以忽略不计。可能没有,因为编译器可能会内联对此方法的部分或所有调用。您真的认为对静态结构字段的内联方法调用会影响应用程序的性能吗?“你有任何经验证据证明这是相关的吗?”沃尔克说,如果我这样写的话——你为什么要问“你真的这么想?”?。我解释了我认为如此的原因——汇编程序。如果你不明白我在说什么,请阅读调用命令。@Don2Quixote-Volker不是那个意思。Peter和Volker都暗示,即使有性能增益,也会有相同的结果;这是微不足道的。编译器进行了大量优化,可能会将其内联。是的,你是对的,它会降低性能。但是,如果最高性能是唯一的目标,那么您的实现应该是这样的:type Stack struct{};func(s*Stack)Push(int){};func(s*Stack)Pop()int{return 0};func(s*堆栈)长度()int{return 0)
因为这是最快的实现,因为它将被优化器完全删除。不幸的是,这个实现有很多缺点。一切都是折衷的,有些折衷非常简单,因为一方的缺点完全可以忽略,这就是我试图解释的