Caching 局部性原则与呼叫指令

Caching 局部性原则与呼叫指令,caching,memory,computer-science,ram,localityofreference,Caching,Memory,Computer Science,Ram,Localityofreference,在讨论地方性原则时,我的教科书作了以下陈述: 除了分支和调用指令,它们只构成一个小的 在所有程序指令中,程序执行是顺序的。 因此,在大多数情况下,必须立即获取指令 遵循最后获取的指令 作为一个新手,我觉得这很难相信。我遇到的所有代码都充满了调用指令。事实上,在我看来,调用指令实际上执行程序中最重要的操作 如果有人能详细解释一下为什么这个概念是正确的,尽管调用指令在程序中扮演着重要角色,我将不胜感激。我在我的计算机上随机选择了一个二进制文件,即货物包管理器。然后我: 用otool-tvV-car

在讨论地方性原则时,我的教科书作了以下陈述:

除了分支和调用指令,它们只构成一个小的 在所有程序指令中,程序执行是顺序的。 因此,在大多数情况下,必须立即获取指令 遵循最后获取的指令

作为一个新手,我觉得这很难相信。我遇到的所有代码都充满了调用指令。事实上,在我看来,调用指令实际上执行程序中最重要的操作


如果有人能详细解释一下为什么这个概念是正确的,尽管调用指令在程序中扮演着重要角色,我将不胜感激。

我在我的计算机上随机选择了一个二进制文件,即
货物
包管理器。然后我:

  • otool-tvV-cargo>组件将其拆解
  • 只得到指令:
    cat汇编| awk'{print$2}'>指令
  • 对每条指令进行计数:
    排序指令| uniq-c | sort-n>计数
我将libreofficecalc中的结果处理为每条指令的出现列表。以下是每个项目中占1%以上的项目(这些项目加起来占86%,因此我为brewity放弃了大量的杂散操作):

这里肯定有很多分支和调用(
callq
jmp
je
jne
),但也有很多内存操作。内存操作相对较慢,并且占用了大量程序的运行时间
movq
只是一个内存操作,它占程序的三分之一以上


CPU缓存用于将最近引用的内存数据保持在靠近CPU核心的位置,从而加快将来对相同数据的内存操作。它们之所以能够做到这一点,是因为在同一内存上的操作通常在时间上接近(时间局部性)。因此,可以缓存内存数据,因为您可能很快会再次需要它。

我在我的计算机上随机选择了一个二进制文件,即
cargo
软件包管理器。然后我:

  • otool-tvV-cargo>组件将其拆解
  • 只得到指令:
    cat汇编| awk'{print$2}'>指令
  • 对每条指令进行计数:
    排序指令| uniq-c | sort-n>计数
我将libreofficecalc中的结果处理为每条指令的出现列表。以下是每个项目中占1%以上的项目(这些项目加起来占86%,因此我为brewity放弃了大量的杂散操作):

这里肯定有很多分支和调用(
callq
jmp
je
jne
),但也有很多内存操作。内存操作相对较慢,并且占用了大量程序的运行时间
movq
只是一个内存操作,它占程序的三分之一以上

CPU缓存用于将最近引用的内存数据保持在靠近CPU核心的位置,从而加快将来对相同数据的内存操作。它们之所以能够做到这一点,是因为在同一内存上的操作通常在时间上接近(时间局部性)。因此,可以缓存内存数据,因为您可能很快会再次需要它。

“小部分”是一个相对术语。我敢打赌,对于每4到5条非分支指令,通常会有1条分支指令。当我看到他们在大学里教的所有学士学位时,我很高兴我在一家电脑公司工作时学到了这一点。“小分数”是一个相对的术语。我敢打赌,对于每4到5条非分支指令,通常会有1条分支指令。当我看到他们在大学里教的所有学士学位时,我很高兴我在一家电脑公司工作时学到了这一点。
| 34.83% | movq    |
| 7.30%  | leaq    |
| 7.00%  | callq   |
| 6.90%  | je      |
| 5.61%  | movl    |
| 4.86%  | cmpq    |
| 3.77%  | testq   |
| 3.11%  | jmp     |
| 2.23%  | jne     |
| 2.17%  | popq    |
| 2.05%  | pushq   |
| 1.69%  | addq    |
| 1.29%  | cmpl    |
| 1.20%  | movabsq |
| 1.18%  | movb    |
| 1.05%  | xorl    |