Caching 使用相同的内存地址重复调用'writev'是否允许硬件缓存?

Caching 使用相同的内存地址重复调用'writev'是否允许硬件缓存?,caching,hardware,Caching,Hardware,我读过一些关于Elixir和Erlang如何使用硬件的性能声明,我想看看我是否理解它们的基础。一些背景: 首先,Erlang支持将不可变字符串(IOList)的嵌套列表写入IO(文件、套接字等),并使用writev和字符串的内存地址来完成此操作() 第二,说: Erlang尊重你的公羊 Erlang与其他平台不同,因为在呈现服务器端模板时,它不会在内存中为每个连接的客户端创建单独的网页副本。相反,它跨多个请求构造指向相同的不可变内存段的指针 因此,如果两个人同时请求两个不同的配置文件页面,他们实

我读过一些关于Elixir和Erlang如何使用硬件的性能声明,我想看看我是否理解它们的基础。一些背景:

首先,Erlang支持将不可变字符串(IOList)的嵌套列表写入IO(文件、套接字等),并使用
writev
和字符串的内存地址来完成此操作()

第二,说:

Erlang尊重你的公羊

Erlang与其他平台不同,因为在呈现服务器端模板时,它不会在内存中为每个连接的客户端创建单独的网页副本。相反,它跨多个请求构造指向相同的不可变内存段的指针

因此,如果两个人同时请求两个不同的配置文件页面,他们实际上会收到相同的内存块,用于页眉、页脚和其他共享模板片段。其结果是,服务器可以每秒为数百名用户构建复杂的未缓存网页,而无需花费大量精力

第三,他说:

模板是预编译的。Phoenix不需要为每个渲染模板复制字符串在硬件级别,您将看到缓存在这些字符串中发挥了前所未有的作用

通过查看源代码,我知道这个框架使用iolist来表示一个完整的响应模板

综上所述,我认为隐含的意思是,如果一个web框架使用
writev
告诉操作系统从相同的内存位置发送相同的页眉和页脚字符串,一个接一个的web请求,硬件将能够说“哦,我知道这个值,它已经在CPU缓存中,所以我不必在RAM中查找它。”

是这样吗?(我对系统调用和硬件了解很少。)如果不是,对如何涉及硬件缓存有什么想法


(如果你能告诉我如何看到或推断发生了什么,那就好了。)

是的,主要是处理器缓存对你有帮助。检索数据所需的时间更短,因为它位于更快的内存中(即CPU缓存)

了解缓存是什么以及它们如何工作的一些指针:


要了解这一点,请测量一个请求在正常服务器操作中所需的时间(客户端)。之后,在同一个vm中有一个单独的进程,该进程会不断创建一个非常大的字符串并将其写入磁盘(它的大小可能必须为兆字节-无论进程上的二级/三级缓存的大小如何)。重新测量请求所需的时间-如果正确执行,则速度应至少慢1个数量级。

Evan Miller的电子邮件回复:“您将通过IOList和共享(refcounted)字符串(>64字节)获得这种缓存利用率。Writev允许您跳过最后的memcpy/展平,这可以在某些负载中提高缓存利用率。测试和测量!"