golang 切片分配性能

2023-12-19

在检查 GO 中内存分配的性能时,我偶然发现了一件有趣的事情。

package main

import (
      "fmt"
      "time"
    )

func main(){
   const alloc int = 65536
   now := time.Now()
   loop := 50000
   for i := 0; i<loop;i++{
      sl := make([]byte, alloc)
      i += len(sl) * 0
   }
   elpased := time.Since(now)
   fmt.Printf("took %s to allocate %d bytes %d times", elpased, alloc, loop) 
}

我在 Core-i7 2600 上运行这个程序,Go 版本 1.6 64 位(在 32 位上也有相同的结果)和 16GB RAM(在 WINDOWS 10 上) 因此,当 alloc 为 65536(正好是 64K)时,它会运行 30 秒(!!!)。 当 alloc 为 65535 时,大约需要 200 毫秒。 有人可以向我解释一下吗? 我在家里用我的核心 i7-920 @ 3.8GHZ 尝试了相同的代码,但没有显示相同的结果(两者都花费了大约 200 毫秒)。有人知道发生了什么事吗?


设置 GOGC=off 可以提高性能(降低到小于 100 毫秒)。为什么? 因为逃逸分析 https://github.com/golang/go/wiki/CompilerOptimizations#escape-analysis-and-inlining。当你构建时go build -gcflags -m编译器打印任何逃逸到堆的分配。这实际上取决于你的机器和 GO 编译器版本,但是当编译器决定分配应该移动到堆时,这意味着两件事: 1.分配将花费更长的时间(因为在堆栈上“分配”只是1个CPU指令) 2. GC 稍后必须清理该内存 - 花费更多的 CPU 时间 对于我的机器,65536 字节的分配会转义到堆,而 65535 则不会。 这就是为什么1个字节将整个过程从200ms变成了30s。惊人的..

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

golang 切片分配性能 的相关文章

  • SQL 中的 JOIN 成本有多高?和/或,性能和标准化之间的权衡是什么?

    我发现了一个类似的线程 但它并没有真正抓住我想要问的本质 所以我创建了一个新线程 我知道规范化和性能之间存在权衡 我想知道划定这条线的最佳实践是什么 在我的特定情况下 我有一个消息传递系统 它具有三个不同的表 messages thread
  • 如何加快编辑距离计算速度

    我正在尝试运行模拟来测试平均值编辑距离 http en wikipedia org wiki Levenshtein distance之间随机 二进制字符串 我的程序是用 python 编写的 但我正在使用这个C扩展 https githu
  • 我们如何在 Golang 中组合多个错误字符串?

    我是 golang 新手 我的应用程序需要在循环中返回多个错误 稍后需要组合并作为单个错误字符串返回 我无法使用字符串函数来组合错误消息 在返回之前可以使用什么方法将这些错误合并为一个错误 package main import fmt s
  • 以编程方式获取 Android 设备的所有 RAM 内存,而不仅仅是分配给用户进程的内存

    我有一台设备 我确信它的 RAM 内存为 512 MB 希望能够以编程方式检索该值 512 MB 到目前为止 我在互联网上遇到的主要是这两种方式 https stackoverflow com a 16143065 1521264 http
  • nsq 无法通过连接到 nsqlookupd 来消费消息

    我尝试使用 docker compose 来运行 nsq docker compose yml如下 version 3 services nsqlookupd image nsqio nsq command nsqlookupd ports
  • 样式组件如何影响性能?

    使用样式组件是否比样式表更会降低 Web 应用程序的速度 如果我关心性能并且没有任何依赖于 props 的样式 我是否应该放弃样式组件并使用样式表 当您有很多小组件时 同时使用样式化组件渲染 性能开销可能会很有意义 绝对值得测试以删除小元素
  • 在 IntelliJ IDEA 中运行。多个文件和错误未定义:数据

    我想使用 IntelliJ IDE 社区版编写代码GO Go语言 我安装了正确的插件 并安装了构建应用程序所需的所有工具 我的应用程序包含以下两个文件 每个都在目录中 事件服务器 Main go Data go 如果我想使用 Run Ctl
  • isinstance(foo,types.GeneratorType)还是inspect.isgenerator(foo)?

    Python中似乎有两种方法来测试一个对象是否是生成器 import types isinstance foo types GeneratorType or import inspect inspect isgenerator foo 本着
  • 我们可以使用什么方法来重塑非常大的数据集?

    当由于非常大的数据计算将花费很长时间并且因此我们不希望它们崩溃时 事先知道要使用哪种重塑方法是很有价值的 Lately methods for reshaping data have been further developed regar
  • STL 容器速度与数组

    我刚刚开始从事一个科学项目 其中速度非常重要 HPC 我目前正在设计数据结构 该项目的核心是双值 3D 网格 以求解偏微分方程 由于这里的速度可能比代码的简单性更重要 我想知道 STL 与通常的 C 风格数组相比如何执行 就我而言 因为它是
  • 在hibernate统计中,load和fetch之间有什么区别

    我主要看EntityStatics http www hibernate org hib docs v3 api org hibernate stat EntityStatistics html http www hibernate org
  • Go 无法推断赋值中的类型:“non-name on left side of :=”

    该片段按预期工作play golang org p VuCl OKMav http play golang org p VuCl OKMav i 10 next 11 prev i i next 然而这个几乎相同的片段给出了non name
  • 如何在 C++ 中急于提交分配的内存?

    总体情况 带宽 CPU 使用率和 GPU 使用率都极其密集的应用程序需要每秒从一个 GPU 向另一个 GPU 传输约 10 15GB 的数据 它使用 DX11 API 来访问 GPU 因此上传到 GPU 只能在每次上传都需要映射的缓冲区中进
  • 如何有效地从 DB2 表中删除所有行

    我有一个大约有 50 万行的表 我想删除所有行 如果我做简单的delete from tbl 事务日志已满 我不关心这种情况下的事务 无论如何我都不想回滚 我可以删除许多事务中的行 但是有更好的方法吗 如何有效地从 DB2 中的表中删除所有
  • 为什么 Go 中只有 int 而没有 float?

    在 Go 中 有这样的类型int这可能相当于int32 or int64取决于系统架构 我可以声明一个整数变量而不用担心它的大小 var x int 为什么没有这个类型float 这相当于float32 or float64取决于我的系统架
  • gcc 没有小字符串优化吗?

    Most std string实现 包括 GCC 使用小字符串优化 例如 有一个answer https stackoverflow com a 21710033 2640636讨论这个 今天 我决定检查我编译的代码中的字符串在什么时候被移
  • fetchsize和batchsize对Spark的影响

    我想通过以下方式控制 RDB 的读写速度Spark直接 但标题已经透露的相关参数似乎不起作用 我可以得出这样的结论吗fetchsize and batchsize我的测试方法不起作用 或者它们确实会影响阅读和写作方面 因为测量结果基于规模是
  • 在 nHibernate 关系中使用实体的 Lite 版本?

    在某些情况下 出于性能原因 创建一个实体的轻量级版本 指向同一个表 但映射的列较少 这是一个好主意吗 例如 如果我有一个包含 50 列的联系人表 并且在一些相关实体中 我可能对 FirstName 和 LastName 属性感兴趣 那么创建
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l

随机推荐

  • OpenGL ES 可以渲染非基本二维的纹理吗?

    在我深入研究将当前的渲染系统转换为 openGL 之前 这只是一个简单的问题 我听说纹理需要采用基本 2 尺寸才能存储以进行渲染 这是真的 我的应用程序内存非常紧张 但大多数位图都不是 2 的幂 存储非基2纹理会消耗更多内存吗 确实 具体取
  • 流程发布资源

    我正在尝试构建我的react native项目并使用react native fbsdk 我在用 电子邮件受保护 cdn cgi l email protection and 电子邮件受保护 cdn cgi l email protecti
  • 如何升级密码存储方案(更改哈希算法)

    我被要求对 Intranet 站点实施一些更改 更新 正如他们所说 使其成为 面向未来 我们发现密码是使用 MD5 算法进行哈希处理的 该系统自 2001 年以来就已经存在 所以当时已经足够了 我们现在想要将哈希算法升级为更强的算法 BCr
  • (function(){})() 和 (function(){}()) 之间的区别,自调用匿名函数[重复]

    这个问题在这里已经有答案了 看看括号的位置 有什么不同吗 函数 function 和 func function 从技术上讲 第一个定义了一个匿名函数 然后调用它 第二个定义了一个匿名函数 该函数在定义时调用自身 实际上 它们是相同的
  • 执行命令时如何在atom中设置环境变量

    我正在尝试将我的环境变量设置为 env DEBUG babel 但我不知道在 Atom 编辑器中哪里可以使用这个设置 要使 shell 的环境变量可供 Atom 使用 请安装以下两个小 Atom 包 来自 shell 的环境 https a
  • PHP 检测 Fetch Api 与 XMLHttpRequest

    截至目前 我的网站正在使用 jQuery Ajax 从前端向后端发出请求 然后后端通过检查 SERVER HTTP X REQUESTED WITH XMLHttpRequest 来确定 ajax 请求 我正在尝试仅切换到本机 JS 并且想
  • 访问公共 AWS s3 存储桶

    我们一群朋友正在做一个 Map Reduce 项目 并且正在处理一个通用数据集 我的朋友已使用他的 AWS 帐户将数据上传到 s3 存储桶 并将 s3 存储桶策略设置为 Version 2008 10 17 Id Policy1417380
  • 特征仅适用于对象吗?

    又在尾巴上这个问题 https stackoverflow com q 68575795 891440 我正在尝试做一个will特质工作 使用这个 打高尔夫球的 代码 sub show value a var say Value of a
  • 通用构造函数和反射

    是否可以看出哪个构造函数是通用构造函数 internal class Foo
  • 执行策略“SqlServerRetryingExecutionStrategy”不支持用户启动的事务

    我有一个 ASP NET Core 5 MVC Web 应用程序 使用 Entity Framework Core 5 我们实现 Web 组件 例如网格或电子表格 我们与 Telerik 合作 当我在组件中进行一些更改 然后尝试保存更改时
  • Highcharts 气泡图数据标签重叠

    如图所示 与小提琴的代码不同 但显示了问题 使用 Highcharts 新的气泡图 数据标签似乎喜欢坐在彼此的顶部 有一个简单的解决方法吗 我很乐意在每个标签的基础上手动更改 z index 但这似乎不适用于气泡图 这是一些无法按预期工作的
  • Matlab 中的 KNN 回归

    Matlab中的k近邻回归函数是什么 只有knn分类功能可用吗 有人知道与此相关的任何有用的文献吗 Regards Farideh 我不相信 k NN 回归算法是直接在 matlab 中实现的 但是如果你进行一些谷歌搜索 你可以找到一些有效
  • 将多个命令绑定到屏幕中的单个键?

    如何将多个命令绑定到 gnu screen 中的一个键 我想合并两个映射 bind c copy bind b eval writebuf exec sh c xsel clipboard lt tmp screen exchange 到单
  • youtube - 无法在轮播/滑块中滑过 iframe

    我有一个带有轮播的响应式网站 用户可以将 YouTube 视频嵌入为其中一张幻灯片 在桌面上这工作正常 然而 在移动设备上 iframe 显然会吃掉所有滑动事件 并且您无法滑过视频 我们必须通过替换视频图像然后使用来解决这个问题window
  • Javascript 事件 addEventListener 为同一函数注册多次;使用 OOP JavaScript

    我正在使用面向对象的 Javascript 并结合注册事件侦听器 根据我对事件监听器的理解 如果应用于 eventtarget 的函数已经注册 则重复尝试添加相同的事件监听器将被忽略 换句话说 它应该只触发一次 但下面的代码并非如此 也可以
  • 使用 JSON 序列化/反序列化 Pandas DataFrame 时如何保留索引的时区

    我需要使用以下方法将 Pandas DataFrame 序列化为 JSONto json方法 这是我如何做到这一点的一个例子 import pandas import numpy as np dr pandas date range 201
  • Hibernate - 第二个查询给出未知的服务请求

    我试图更好地理解 Hibernate 的工作原理 我有一个无法解决的问题 当应用程序启动时 它会进行查询 Session session HibernateUtil getSessionFactory getCurrentSession s
  • 在内部专用网络上保护 SOAP Web 服务的最佳方法是什么

    如今 越来越多的 Web 服务是为内部使用而开发的 用于将应用程序连接在一起 我们没有 ESB 来控制和保护此 Web 服务 因此我猜测什么是保护它们的好方法 我们尝试设置双向 SSL 但无法控制特定 Web 服务的授权 我的需要是能够控制
  • 通过输入前几个字符跳转到列表框项目

    我有一个项目列表 可能很大 用户必须从中选择一个 我想允许用户输入前几个字母所需项目的跳转到列表中的正确位置 默认情况下 每次按键都会跳转到以该字母开头的第一个项目 因此您无法键入第一个项目several字母 有什么简单的方法可以做到这一点
  • golang 切片分配性能

    在检查 GO 中内存分配的性能时 我偶然发现了一件有趣的事情 package main import fmt time func main const alloc int 65536 now time Now loop 50000 for