- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
一般来说,我记得程序的堆栈
是内存中以特殊方式处理的特殊部分(通过LIFO
结构,即一个“堆栈”)。
我在 Linux 中使用 C 和 C++ 工作,我不确定以下几点
堆栈是一 block 通用内存,这是否意味着在 Linux 进程中它应该位于该进程的虚拟内存的某个页面中?
我习惯于知道,如果一 block 内存(我一直只考虑堆)驻留在 L1 缓存中,检索起来会比 L3 缓存更快。它也适用于堆栈吗?
现在堆栈通常比堆快,但如果第 2 点为真,堆栈中的一些数据可能仍然在 L3 行中并导致系统变慢。
我在以下方面的推理是否正确,还是我遗漏了什么?
最佳答案
它是特定于处理器的:AMD 和英特尔在做不同的事情,甚至在每个品牌中它也是特定于型号的。
一些处理器(我忘了是哪个,也许是旧的 AMD)正在关联堆栈 机器 指令(即 PUSH
、POP
、RET
和 CALL
等...)到 L1 缓存。
顺便说一句,Andrew Appel 写道(在上个世纪)garbage collection can be faster than stack allocation (对于使用 CPS 技术编译的 SML),但是,IIRC,这在今天不太正确,因为当前处理器有一些与 call stack 相关的行为到缓存。
但我相信调用堆栈的热门部分通常在 L1 缓存中(即使没有硬件来帮助),因为那里的数据(局部变量、返回地址...)经常被访问。
当然,调用栈在virtual memory中;使用 proc(5) ,例如尝试
tail /proc/$$/maps
(你可以使用 cat
而不是 tail
)来获得也许:
7f6366db5000-7f6366dd5000 r-xp 00000000 08:11 2100860 /lib/x86_64-linux-gnu/ld-2.19.so
7f6366fac000-7f6366fb0000 rw-p 00000000 00:00 0
7f6366fcc000-7f6366fd3000 r--s 00000000 08:11 964796 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
7f6366fd3000-7f6366fd5000 rw-p 00000000 00:00 0
7f6366fd5000-7f6366fd6000 r--p 00020000 08:11 2100860 /lib/x86_64-linux-gnu/ld-2.19.so
7f6366fd6000-7f6366fd7000 rw-p 00021000 08:11 2100860 /lib/x86_64-linux-gnu/ld-2.19.so
7f6366fd7000-7f6366fd8000 rw-p 00000000 00:00 0
7fff59aa1000-7fff59ac2000 rw-p 00000000 00:00 0 [stack]
7fff59bfe000-7fff59c00000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
注意 [stack]
段。
根据(CPU caches 的)定义,L1 缓存通常包含最常访问的数据。缓存未命中代价高昂(访问 RAM 棒中的数据可能比访问 L1 缓存慢 100 倍)。
关于c++ - 堆栈、高速缓存未命中和虚拟内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25144290/
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 3 年前。 Improve th
作为练习,我正在尝试使用 Thread.sleep 作为计时器并使用 JMF 作为声音来使用 Java 创建一个节拍器。它运行良好,但出于某种原因,JMF 似乎只能以每分钟最多 207 拍的速度播放声
有谁知道对用户浏览器进行基准测试的快速方法?它不需要那么准确。 我开始在我们的软件平台中使用 Javascript 执行越来越多的密集型任务,我担心性能在旧浏览器上会成为一个问题,所以我想要的是我可以
我的数据看起来像每帧 1000 万个数值(实数 + 二进制)(想想数组,即数组的一行中有 1000 万个元素)并且大约有 100 帧/秒。一种时间序列。 我的挑战是: (1) 存储——数据量 (2)
在使用 Android 时,我丢失了传入 USB 数据流上的数据,而在 Windows 中读取同一设备/流时我不会丢失这些数据。 (我知道 Android 不是实时操作系统,但 Windows 也不是
在我目前正在做的一个C#项目中,我们试图计算网络上大量文件的MD5(当前pot是270万,客户端pot可能超过1000万)。随着我们处理的文件数量的增加,速度成为问题。 我们这样做的原因是为了验证文件
我一直在尝试使用 XSLT 在最有效的时间内从 XML 文档获取 CSV 数据。以下是我的示例 XML Raagu Hoskote
如果标题听起来令人困惑,我很抱歉,如果您在这段描述后有更好的想法,请随时提出建议。 简而言之,我在 Linux 上使用 PHP 以及以下假设的文件/代码: job.php: if(setting_ge
对最多 1000 万个 7 位数字进行排序。约束条件:1M RAM,高速。几秒就好。 [编辑:来自提问者的评论:输入值不同] 使用位图数据结构可以很好地解决这个问题。 这意味着我需要一个字符串,它的长
我是一名优秀的程序员,十分优秀!