GO初学者问一个循环问题

meiruhua · 2021-09-14 15:14:35 · 2085 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2021-09-14 15:14:35 的主题,其中的信息可能已经有所发展或是发生改变。

在本机测试为什么go循环这么慢? 如下代码循环要6-8秒,但是同样的代码写成php只要0.009秒左右,我哪里操作不对吗?

GO:

func main() {
    st := time.Now().Unix()
    str := ""
    for i := 0; i < 100000; i++ {
        str += "hello" + strconv.Itoa(i)
    }
    fmt.Println(time.Now().Unix() - st)
}

1111111.png

PHP:

        $t1  = microtime(true);
        $str = '';
        for ($i = 0; $i < 100000; ++$i) {
            $str .= "hello" . (string)$i;
        }
        echo microtime(true) - $t1;

php.png


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2085 次点击  
加入收藏 微博
12 回复  |  直到 2021-09-26 17:26:33
kiripeng214
kiripeng214 · #1 · 4年之前

st := time.Now().Unix() var buffer bytes.Buffer for i := 0; i < 100000; i++ { buffer.WriteString("hello" + strconv.Itoa(i)) } fmt.Println(time.Now().Unix() - st) 用bytes.buffer string拼接本身是重新分配了对象,一个字符串是一个不可改变的字节序列 https://studygolang.com/articles/21629 原因看这个

kiripeng214
kiripeng214 · #2 · 4年之前
st := time.Now().Unix()
    var buffer bytes.Buffer
    for i := 0; i < 100000; i++ {
        buffer.WriteString("hello" + strconv.Itoa(i))
    }
    fmt.Println(time.Now().Unix() - st)

用bytes.buffer string拼接本身是重新分配了对象,一个字符串是一个不可改变的字节序列 https://studygolang.com/articles/21629 原因看这个

meiruhua
meiruhua · #3 · 4年之前

变成了 0.011 秒左右了,小细节真多。

tablecell
tablecell · #4 · 4年之前
meiruhua
meiruhua · #5 · 4年之前
tablecelltablecell #4 回复

https://zhuanlan.zhihu.com/p/162998384

这些测试忽略了一个低调的大佬,webman,去测试下这个会有惊喜。

tablecell
tablecell · #6 · 4年之前

mixhpp.jpg

entrehuihui
entrehuihui · #7 · 4年之前

不知道你是怎么测的 直接复制你的代码秒改成纳秒换算就用时4毫秒

entrehuihui
entrehuihui · #8 · 4年之前

image.png

tablecell
tablecell · #9 · 4年之前

go run test.go

35

php53.jpg

meiruhua
meiruhua · #10 · 4年之前
entrehuihuientrehuihui #7 回复

不知道你是怎么测的 直接复制你的代码秒改成纳秒换算就用时4毫秒

这个和测试的机器有关系,配置好速度就快些。

yuzihui1993
yuzihui1993 · #11 · 4年之前

你用了最低效的方法做拼接

yuzihui1993
yuzihui1993 · #12 · 4年之前

st := time.Now().Unix() var str strings.Builder for i := 0; i < 100000; i++ { str.WriteString("hello" + strconv.Itoa(i)) } fmt.Println(time.Now().Unix() - st)

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传