请告诉我一些示例代码,我们使用可忽略的CPU和存储量,但大量使用RAM?就像,如果我运行循环并创建对象,这将消耗RAM而不是CPU或存储。我的意思是告诉我一些记忆昂贵的操作。
答案 0 :(得分:3)
appzYourLife给出了一个很好的例子,但我想提出一个更概念性的答案。
记忆力很慢。就像它真的很慢,至少在CPU运行的时间尺度上。有一个名为memory hierarchy的概念,它说明了成本/容量和速度之间的权衡。
为了防止快速CPU浪费时间等待慢速内存,我们想出了CPU cache,这是一个非常小的数量(它很昂贵!)非常快的内存。 CPU永远不会直接与RAM交互,只与最低级别的CPU缓存交互。只要CPU需要不属于缓存的数据,就会调度memory controller从RAM获取所需的数据并将其放入缓存中。内存控制器直接执行此操作,无需CPU参与(这样CPU可以在浪费这个慢速内存I / O时处理另一个进程)。
然而,内存控制器可以很聪明地了解它如何进行内存提取。 principle of locality开始发挥作用,这是CPU倾向于主要处理密切相关(内存接近)数据的趋势,例如数据数组或连续多个指令系列。知道了这一点,内存控制器可以很快地从RAM中预取数据(根据各种预测算法,CPU设计中的一个关键主题),并在CPU知道它需要它之前将其提供给CPU。可以把它想象成一个外科医生的助手,他会抢占需要的工具,并提供在需要的时候将它们交给外科医生,而不需要外科医生需要它们,也不需要外科医生等待助手去得到他们然后回来。
要最大限度地利用RAM,您需要最大限度地减少缓存使用量。这可以通过在内存中的远程位置之间进行大量意外跳转来完成。通常,链接结构(例如链接列表)可能导致这种情况发生。如果链接结构由遍布RAM的所有节点组成,则内存控制器无法预测其所有位置并预取它们。遍历这样的结构将导致许多“缓存未命中”(数据未缓存的内存请求,必须从RAM中获取),这是RAM密集型。
最终,CPU通常也会被大量使用,因为它不会等待内存访问,而是会执行系统上运行的其他进程的指令,如果有的话。
答案 1 :(得分:2)
在Swift中,Int64
类型需要64位内存。因此,如果为1000000 Int64
分配空间,则将保留8 MB的内存。
UnsafeMutablePointer<Int64>.alloc(1000000)
由于您没有初始化该内存,因此该进程不应占用太多CPU,您只需分配它。