ChatGPT初体验

先看我与ChatGPT的聊天记录

再说说我的疑惑

  1. bytes.Equal(a, b []byte) bool函数的内部实现是将两个字节强转成字符串后再用==运算符比较的,它竟然不知道!
  2. ChatGPT说使用==运算符会产生一次内存拷贝。

下面Golang源码bytes包的Equal(a, b []byte) bool函数的实现:

// Equal reports whether a and b
// are the same length and contain the same bytes.
// A nil argument is equivalent to an empty slice.
func Equal(a, b []byte) bool {
    // Neither cmd/compile nor gccgo allocates for these string conversions.
    return string(a) == string(b)
}

然后我根据ChatGPT对bytes.Equal的描述,实现了一个类似的函数:

//比较两个字符串是否相等
func StringEqual(a, b string) bool {
    if len(a) != len(b) {
        return false
    } else if len(a) == 0 {
        return true
    }
    //这里利用unsafe提供的方法,将字符串无内存开销的转成字节切片,比ChatGPT描述的更优
    x := unsafe.Slice(unsafe.StringData(a), len(a))
    y := unsafe.Slice(unsafe.StringData(b), len(b))
    //逐字节对比,不一致立刻返回
    for k, v := range x {
        if y[k] != v {
            return false
        }
    }
    return true
}

然后我根据ChatGPT的提示,对比较字符串是否相等的方式进行了多角度的测试。
其中bytes.Equal函数被我替换成了自己实现的StringEqual函数,因为bytes.Equal的内部实现就是==运算符。
EqualFoldGolang源码strings包的函数。
测试结果如下:

aaa vs aaa
==           1.843 ns/op           0 B/op          0 allocs/op
EqualFold    5.608 ns/op           0 B/op          0 allocs/op
StringEqual  3.042 ns/op           0 B/op          0 allocs/op

aaa vs bbb
==           4.024 ns/op           0 B/op          0 allocs/op
EqualFold    3.119 ns/op           0 B/op          0 allocs/op
StringEqual  1.912 ns/op           0 B/op          0 allocs/op

aaa vs ""
==           0.7936 ns/op          0 B/op          0 allocs/op
EqualFold    2.870 ns/op           0 B/op          0 allocs/op
StringEqual  0.7891 ns/op          0 B/op          0 allocs/op

006406F42C0757B750 vs 006406F42C0757B750
==           1.852 ns/op           0 B/op          0 allocs/op
EqualFold    16.39 ns/op           0 B/op          0 allocs/op
StringEqual  13.46 ns/op           0 B/op          0 allocs/op

006406F42C0757B750 vs 006406F42C0757B783
==           5.087 ns/op           0 B/op          0 allocs/op
EqualFold    22.26 ns/op           0 B/op          0 allocs/op
StringEqual  12.44 ns/op           0 B/op          0 allocs/op

006406F42C0757B750 vs ""
==           0.7845 ns/op          0 B/op          0 allocs/op
EqualFold    2.799 ns/op           0 B/op          0 allocs/op
StringEqual  0.8201 ns/op          0 B/op          0 allocs/op

从测试结果可以得出两个结论:

  1. ==运算符是比较字符串是否相等的最快最稳的方式。
  2. ==运算符在做字符串比较的时候并没有内存的分配开销。

最后说说感慨

  1. 以后这种机器人成熟了,不是说人类就不用思考和学习了,反而是要更卷,否则它说什么就是什么,自己毫无判断能力,那就是ai时代的文盲了。
  2. 针对编程的提问,它的回答还是非常厉害的,如果回答其它的理科问题也这么秀,那就you’di
本作品采用《CC 协议》,转载必须注明作者和本文链接
梦想星辰大海
讨论数量: 3

问他个简单的计算题:怎么证明哥德巴赫猜想

1年前 评论
梦想星辰大海 (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!