我的编程空间,编程开发者的网络收藏夹
学习永远不晚

GC 占据CPU 时间的 90%

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

GC 占据CPU 时间的 90%

一分耕耘,一分收获!既然都打开这篇《GC 占据CPU 时间的 90%》,就坚持看下去,学下去吧!本文主要会给大家讲到等等知识点,如果大家对本文有好的建议或者看到有不足之处,非常欢迎大家积极提出!在后续文章我会继续更新Golang相关的内容,希望对大家都有所帮助!

问题内容

我正在用 go 语言为一种简单的、虚构的编程语言编写一个虚拟机。我正在使用探查器 pprof 来提高性能。我正在用我编写的语言运行斐波那契函数来测试递归函数。

func fib(n) {
    if n < 2 {
        return n
    } else {
        return fib(n-1) + fib(n-2)
    }
}
print fib(34)

当我运行这个程序时,需要 14 秒,而在 python 中则需要 2 秒。这是 pprof 的图像。我用绿色突出显示了实际程序的函数调用。他们花了 2 秒,另外 12 秒似乎都是 go 的垃圾收集器。 有什么方法可以找出垃圾收集器花费如此多时间的原因吗?


解决方案


如icza noted in a comment,实际上将其编译为go代码并运行,它运行得相当快:

package main

import (
    "fmt"
    "time"
)

func fib(n int) int {
    if n < 2 {
        return n
    } else {
        return fib(n-1) + fib(n-2)
    }
}

func main() {
    s := time.now()
    fmt.println(fib(34))
    d := time.now().sub(s)
    fmt.println("took", d)
}

$ go run fib.go
5702887
took 49.244697ms

(注意:上面的内容很草率:我们应该使用 int64,我只是懒)。

python3 变体:

import time
def fib(n):
    if n < 2:
        return n
    return fib(n-1) + fib(n-2)

s = time.time()
print(fib(34))
print(f"took {time.time() - s}s")

需要更长的时间:

$ python3 fib.py
5702887
took 2.1027958393096924s

如 peterSO notes 所示,递归算法进行了很多调用:

package main

import (
    "fmt"
    "time"
)

var calls int

func fib(n int) int {
    calls += 1
    if n < 2 {
        return n
    } else {
        return fib(n-1) + fib(n-2)
    }
}

func main() {
    s := time.Now()
    fmt.Println(fib(34))
    d := time.Now().Sub(s)
    fmt.Println("took", d, "to make", calls, "calls")
}

$ go run fib.go
5702887
took 53.328049ms to make 18454929 calls

(额外的几毫秒是由于对调用进行计数)。因此,go 在大约 50 毫秒内运行了 1845 万次调用,而 python 在大约 2.1 秒内运行了同样的 1845 万次调用。 go 每次调用大约花费 2.7 纳秒,python 每次调用大约花费 114 毫秒。

好了,本文到此结束,带大家了解了《GC 占据CPU 时间的 90%》,希望本文对你有所帮助!关注编程网公众号,给大家分享更多Golang知识!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

GC 占据CPU 时间的 90%

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

GC 占据CPU 时间的 90%

一分耕耘,一分收获!既然都打开这篇《GC 占据CPU 时间的 90%》,就坚持看下去,学下去吧!本文主要会给大家讲到等等知识点,如果大家对本文有好的建议或者看到有不足之处,非常欢迎大家积极提出!在后续文章我会继续更新Golang相关的内容,
GC 占据CPU 时间的 90%
2024-04-04

LoadRunner中90%响应时间的理解

最近有朋友老问关于90%的响应时间不太理解,顾摘录如下内容供大家参考:官方解释:Solution: The 90th percentile is the value for which 90% of the data points are
2023-06-05

长时间查询占用元数据锁导致gh-ost变更失败

刚才完成了合同表的变更,到最后一步rename table的时候 ,有个长时间的查询占用了元数据锁,导致rename的最后一步不能进行。将该会话kill后rename完成。
长时间查询占用元数据锁导致gh-ost变更失败
2021-08-06

因为scrollbar占据空间导致的bug如何修复

因为scrollbar占据空间导致的bug如何修复?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。正文昨天, 测试提了个问题, 现象是一个输入框的聚焦提示偏了, 让我修一下,
2023-06-08

SQLServer 错误 17883 计划程序 %ld 的进程 %ld:%ld:%ld (0x%lx)工作线程 0x%p 似乎无法完成。 线程创建时间: %I64d。 线程占用 CPU 的近似时间:

详细信息 Attribute 值 产品名称 SQL Server 事件 ID 17883 事件源 MSSQLSERVER 组件 SQLEngine 符号名称 SRV_SCHEDULER_NONYIELDING ...
SQLServer 错误 17883 计划程序 %ld 的进程 %ld:%ld:%ld (0x%lx)工作线程 0x%p 似乎无法完成。 线程创建时间: %I64d。 线程占用 CPU 的近似时间:
2023-11-05

Java怎么查询时间段间的数据

这篇“Java怎么查询时间段间的数据”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java怎么查询时间段间的数据”文章吧。J
2023-06-29

Mysql数据库中的时间与页面显示时间相差8小时

Mysql数据库中的时间与页面显示时间相差8小时 原因分析: 1、本地mysql时区 2、代码映射时区 3、连接数据库时区 可能存在不一致。 解决方案: 1.查询数据库的时区 show variables like '%time_zone
2023-08-16

oracle删除数据但表空间占用率没有减小的情况

这篇文章主要介绍了oracle删除数据但表空间占用率没有减小的情况,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-15

sql怎么查询两个时间段之间的数据

要查询两个时间段之间的数据,可以使用SQL的BETWEEN关键字。以下是一个示例查询:假设有一个名为orders的表,其中有一个order_date列存储订单日期。SELECT * FROM ordersWHERE order_da
sql怎么查询两个时间段之间的数据
2024-04-09

sql如何查询两个时间段之间的数据

SQL查询两个时间段之间的数据可以使用`BETWEEN`关键字。以下是一个示例查询语句:```sqlSELECT * FROM 表名WHERE 时间列 BETWEEN '起始时间' AND '结束时间'```其中,`表名`是要查询的表的名称
2023-09-13

SQL数据库连接超时时间已到的问题

目录SQL数据库连接超时时间已到问题解决方法数据库访问超时时间配置总结1.背景2.配置说明3.方案总结SQL数据库连接超时时间已到问题1:System.InvalidOperationException: 超时时间已到。超时时间已到,但
2023-04-12

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录