代码顺序和性能

2023-12-23

我想找到哪个更快:结构与数组。因此,我编写了一段 GO 代码,其中将 4 个 int 值(1、2、3 和 4)写入结构体的成员,然后写入长度为 4 的数组。我试图找出写入所需的时间。

Case1:首先,我将值写入结构体,然后写入数组。在这里我发现数组比结构更快。

package main

import (
    "fmt"
    "time"
)

type abc struct {
    a, b, c, d int
}

func main() {

    var obj abc

    t1 := time.Now()
    obj.a = 1
    obj.b = 2
    obj.c = 3
    obj.d = 4
    t2 := time.Since(t1)

    fmt.Println("Struct access time: : ", t2)

    a := make([]int, 4)
    t3 := time.Now()
    a[0] = 1
    a[1] = 2
    a[2] = 3
    a[3] = 4
    t4 := time.Since(t3)

    fmt.Println("Array access time: : ", t4)

}

Case2:其次,我将值写入数组,然后写入结构体。在这里我发现结构比数组更快。

package main

import (
    "fmt"
    "time"
)

type abc struct {
    a, b, c, d int
}

func main() {

    var obj abc

    a := make([]int, 4)
    t3 := time.Now()
    a[0] = 1
    a[1] = 2
    a[2] = 3
    a[3] = 4
    t4 := time.Since(t3)

    fmt.Println("Array access time: : ", t4)

    t1 := time.Now()
    obj.a = 1
    obj.b = 2
    obj.c = 3
    obj.d = 4
    t2 := time.Since(t1)

    fmt.Println("Struct access time: : ", t2)

}

为什么性能取决于我先写的内容​​?我第一个写信的人似乎比较慢。为什么会这样呢?


第一次运行任何代码可能会产生一些(显着的)开销,例如相关代码可能会被加载,许多事情可能会被推迟到需要时为止(例如内部缓冲区)。再次运行同样的事情可能会花费更少的时间,差异甚至可能是几个数量级.

每当你想要测量执行时间时,你应该运行它多次,测量多次运行的执行时间,并计算平均时间。由于上述原因,从计算中排除第一次(某些)运行也是一个好主意。

在 Go 中,最好也是最简单的方法是使用测试文件和基准测试函数。阅读包文档testing https://golang.org/pkg/testing/了解更多详细信息和示例。

您的案例可以这样进行基准测试:

package main

import "testing"

type abc struct {
    a, b, c, d int
}

func BenchmarkSlice(b *testing.B) {
    a := make([]int, 4)
    for i := 0; i < b.N; i++ {
        a[0] = 1
        a[1] = 2
        a[2] = 3
        a[3] = 4
    }
}

func BenchmarkStruct(b *testing.B) {
    a := abc{}
    for i := 0; i < b.N; i++ {
        a.a = 1
        a.b = 2
        a.c = 3
        a.d = 4
    }
}

将其保存到类似的文件中something_test.go,运行它go test -bench .。输出:

BenchmarkSlice-4        2000000000           1.24 ns/op
BenchmarkStruct-4       2000000000           0.31 ns/op

可以看到使用struct大致就是4 times快点。如果您重新排序基准函数,您将获得类似(非常接近)的结果。

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

代码顺序和性能 的相关文章

  • Java 增强型 For-Loop 比传统的更快?

    所以我的理解是 增强的 for 循环应该更慢 因为它们必须使用迭代器 但是我的代码提供了混合结果 是的 我知道循环逻辑占用了循环中花费的大部分时间 对于少量迭代 100 1000 增强的 for 循环在使用和不使用 JIT 的情况下似乎都要
  • SwiftUI - 使用“ObservableObject”和@EnvironmentObject 有条件地显示视图

    我想在我的应用程序中有条件地显示不同的视图 如果某个布尔值为 true 则将显示一个视图 如果为 false 将显示不同的视图 该布尔值位于 ObservableObject 类中 并根据将要显示的视图之一进行更改 PracticeStat
  • 网页优化:为什么组合文件速度更快?

    我读过 将所有 css 文件合并为一个大文件 或将所有脚本文件合并为一个脚本文件 可以减少 HTTP 请求的数量 从而加快下载速度 但我不明白这一点 我认为如果你有多个文件 最多有一个限制 我相信在现代浏览器上是 10 个 浏览器会并行下载
  • 访问结构向量

    我有一个结构 struct OutputStore int myINT string mySTRING 如果我创建一个 OutputStore 类型的数组 如下所示 OutputStore OutputFileData new Output
  • Mysql 更快的 INSERT

    好的 我有大约 175k 个 INSERT 语句 相当大的 INSERT 语句 例如 INSERT INTO gast ID Identiteitskaartnummer Naam Voornaam Adres Postcode Stad
  • 在 Chrome 18 中检测 SwiftShader WebGL 渲染器

    我有一个 2D HTML5 游戏引擎 www scirra com http www scirra com 并且确实想检测 WebGL 是否将使用 Chrome 18 的 Swiftshader 软件渲染器进行渲染 如果是这样我们会much
  • OpenMP 共享与第一私有性能比较

    我有一个 pragma omp parallel for在类方法内循环 每个线程只读访问很少的方法局部变量 很少调用私有数据和方法的参数 所有这些都在一个声明中声明shared条款 我的问题 性能方面不应该有任何区别声明这些 变量share
  • 将中间件与 Golang Gorilla mux 子路由器结合使用

    如何将中间件应用到 Go 中大猩猩工具包 http www gorillatoolkit org 多路复用器子路由器 我有以下代码 router mux NewRouter StrictSlash true apiRouter router
  • 为什么在 CSS3 中启用硬件加速会降低性能?

    我在 css3 实验中将 10 000 个小 div 元素从浏览器视口的顶部移动到底部 对于此测试 我使用两种不同的方法 使用 GPU 加速translate3D x y z or translateZ 0 无需 GPU 加速 只需调整to
  • 如何提高Canvas渲染性能?

    我必须画很多Shape http msdn microsoft com en us library system windows shapes shape aspx 约 1 20 万 作为 Canvas 2 的子级 我在 WPF 应用程序中
  • 关于编写惯用的 Golang 的建议

    我正在掌握 Golang 的做事方式 首先是一些示例代码 package main import log os func logIt s string f os OpenFile errors log os O RDWR os O CREA
  • C++,最佳实践,int 还是 size_t? [复制]

    这个问题在这里已经有答案了 可能的重复 何时使用 std size t https stackoverflow com questions 1951519 when to use stdsize t hello 假设使用模式相同 即没有负数
  • 在 Java 中有效地对图像进行颜色循环

    我正在编写一个曼德尔布罗分形查看器 我想以智能的方式实现颜色循环 给定一个图像 我想修改它的 IndexColorModel 据我所知 没有办法修改 IndexColorModel 也没有办法为图像提供新的 IndexColorModel
  • mysql查询先慢后快

    我有 2 个 myISAM 表 分别称为 tests 和 completed tests 一个有 170 个条目 另一个有 118k 条目 当我运行此查询时 SELECT ct archive ct status ct score ct u
  • 如何读取 UDP 连接直至超时?

    我需要读取 UDP 流量 直到超时 我可以通过在 UDPConn 上调用 SetDeadline 并循环直到出现 I O 超时错误来做到这一点 但这看起来很黑客 基于错误条件的流量控制 下面的代码片段看起来更正确 但并没有终止 在生产中 这
  • std::bind2nd 和 std::bind 与二维数组和结构数组

    我知道 C 有 lambda 并且 std bind1st std bind2nd 和 std bind 已弃用 然而 从C 的基础开始 我们可以更好地理解新特性 所以 我从这个非常简单的代码开始 使用int 数组s 第一个例子 与std
  • 将 numpy 数组写入文本文件的速度

    我需要将一个非常 高 的两列数组写入文本文件 而且速度非常慢 我发现如果我将数组改造成更宽的数组 写入速度会快得多 例如 import time import numpy as np dataMat1 np random rand 1000
  • 调整 Oracle 数据库以加快启动速度(闪回)

    我正在使用 Oracle 数据库 11 2 我有一个场景 我发出FLASHBACK DATABASE经常 似乎有一个FLASHBACK DATABASECycle 会重新启动数据库实例 大约需要 1 分钟 我的设置花了 7 秒 数据库很小
  • 为什么 java.util.Arraylist#clear 按照 OpenJDK 中的方式实现?

    http grepcode com file repository grepcode com java root jdk openjdk 6 b14 java util ArrayList java 473 http grepcode co
  • 如何在 Go 中获取给定月份的第一个星期一?

    我正在尝试获取给定月份的第一个星期一 我能想到的最好方法是循环前 7 天 然后返回 Weekday Monday 有一个更好的方法吗 通过查看时间的 Weekday 您可以计算出第一个星期一 package main import fmt

随机推荐

  • 单例的实例类型与类名?

    据我了解 instancetype向编译器声明该方法的返回类型与接收消息的类相同 传统上 我总是声明我的单例初始值设定项 并将类名显式设置为返回类型 interface MyClass NSObject MyClass sharedInst
  • 使用jquery在ul中添加li元素

    我尝试制作简单的待办事项列表 这是我的 html 代码
  • jQuery UI 对话框关闭时刷新父页面

    因此 每次关闭 jQuery UI 中的特定对话框时 我都希望刷新父页面 我怎样才能做到这一点 jQuery 代码 document ready function var dlg createTeam dialog title Create
  • 在类构造函数中实例化供应商类

    在我的 CakePHP 2 应用程序中 我有这样的供应商 我需要在我的控制器类中创建此供应商类的实例 所以我将在控制器的不同功能中使用该实例 App import Vendor fancyVendor array file gt fancy
  • Emacs 中的文本转语音

    我不是瞎子 我只是想有一种方法让我的 Windows 机器大声读取缓冲区的内容 以下是基本要求 读取任何英文文本缓冲区 随时暂停阅读并随时恢复 而不是当有人走进我的办公室时等待几分钟等待大缓冲区完成 调整播放时的读回速度 突出显示当前正在阅
  • 特征:矩阵到四元数和后面有不同的结果

    我使用 Eigen 库将矩阵转换为四元数 但是当我将其中一个矩阵转换为四元数并将其烧回时 它变成了另一个矩阵 即单位矩阵 我使用的旋转矩阵是从变换矩阵分解而来的 Eigen Matrix3f R3d R topLeftCorner lt 3
  • 如何使用 WPF 中的资源图标?

    我有一个作为资源嵌入的 ico 文件 构建操作设置为资源 我正在尝试创建一个 NotifyIcon 如何引用我的图标 notifyIcon new NotifyIcon notifyIcon Icon my icon file is cal
  • 理解php中的浮点数

    我知道这些问题可能会被很多人问到 但从我的阅读和测试来看 它让我有点困惑 而且我所做的很多阅读让我更加困惑 因为它非常复杂 有些人似乎对简单的比较有问题 但我自己没有问题 例如 num1 27 64 num2 27 64 if num1 n
  • 重新部署 JRebel 的替代方案 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 JRebel 允许重新部署新编译的代码 而无需重新启动应用程序 我想知道是否有任何替代方案 免费 这FAQ http zeroturnar
  • angularjs中的transformRequest是什么

    我有一个代码 transformRequest function obj var str for var p in obj str push encodeURIComponent p encodeURIComponent obj p ret
  • partykit:将终端节点箱线图更改为显示平均值和标准差的条形图

    我在 R 中创建了一个回归树 这是代码 tree lt rpart y method anova minsplit 20 minbucket 20 maxdepth 3 data foo plot as party tree termina
  • 使用 CUPS 或其他框架从 iOS/iPad 打印到 Epson TM-T88V 收据打印机

    有谁知道如何获得CUPS运行于iOS 我们正在尝试打印到网络Epson收据打印机 TM T88V 从 iPad 使用CUPS或其他方法 但我们在让 CUPS 在 iOS 上运行时遇到了障碍 我知道这是可以做到的 因为 iPad 应用程序已经
  • Google Maps Android API v2 - 恢复地图状态

    我正在使用 Google Maps Android API v2 构建一个非常简单的地图应用程序 正如预期的那样 当用户离开然后返回应用程序时 他们在位置 缩放等方面所做的任何更改都会随着 Activity 被销毁并重新创建而丢失 我知道我
  • 使用Python将数据写入雪花

    我们可以不使用Python的Snowflake内部阶段直接将数据写入雪花表吗 先在stage中写入 然后对其进行转换 然后将其加载到表中 这似乎是辅助任务 是否可以像RDBMS中的JDBC连接一样一步完成 将数据加载到 Snowflake
  • 带默认参数的 kotlin 重载方法

    这是场景 我得到了以下两种方法 fun foo p1 Int p2 String null fun foo p1 Int p2 Int 0 具体方法如何参考foo 1 如果调用者只有一个参数 则这是一个错误 foo 1 error 错误 Y
  • 无需重启服务器即可查看代码更改

    我们使用 Visual Studio Code 和 DNX 如下所示 启动 Web 服务器的命令行 dnx web 项目 json gt 命令 web Microsoft AspNet Hosting server Microsoft As
  • 安装失败,并显示消息无法使用“cmd package install-create -r -t -S 1647504”创建安装会话

    我在尝试通过 android studio 3 4 1 运行 apk 时收到错误消息 安装失败 并显示消息无法使用 cmd package install create r t S 1647504 创建安装会话 通过卸载现有版本的 apk
  • 我应该在 ssh 公钥中使用我的个人电子邮件吗?

    阅读 Github 的生成 SSH 密钥 https help github com articles generating ssh keys 教程 我在第 2 步 生成新的 SSH 密钥 https help github com art
  • 为什么 python 模块可以在 shell 中工作,但不能在脚本中工作?

    我正在尝试制作两个程序 我想要一台打印我居住城市的当前天气 而我想要另一台从在线帐户获取数据并将其返回 对于这些脚本 我导入 yweather 模块和 requests 模块 当我将它们导入 shell 时没有问题 但是当我运行脚本时它显示
  • 代码顺序和性能

    我想找到哪个更快 结构与数组 因此 我编写了一段 GO 代码 其中将 4 个 int 值 1 2 3 和 4 写入结构体的成员 然后写入长度为 4 的数组 我试图找出写入所需的时间 Case1 首先 我将值写入结构体 然后写入数组 在这里我