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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.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
Performance Go、封装和性能_Performance_Go_Compiler Optimization - Fatal编程技术网

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
慢,因为它是一个函数调用吗

具体而言:

  • 为什么你认为这是一个函数调用?它看起来像一个,但实际的Go编译器通常会按顺序扩展代码
  • 为什么您认为函数调用比内联代码慢?在实际计算机上测量实际程序时,有时函数调用比内联代码快。事实证明,关键部分通常是正在执行的指令及其操作数是否已经在适当的CPU缓存中。有时,内联扩展函数会使程序运行得更慢

  • 编译器应该进行内联扩展,除非它使程序运行得更慢。编译器在检测此类减速(如果存在)之前或之后的表现如何,则是另一个问题。在这种特殊情况下,给定函数定义,编译器几乎肯定会直接展开函数,因为访问
    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)
    因为这是最快的实现,因为它将被优化器完全删除。不幸的是,这个实现有很多缺点。一切都是折衷的,有些折衷非常简单,因为一方的缺点完全可以忽略,这就是我试图解释的