当前位置: 首页 > 知识库问答 >
问题:

bool vs int数组的性能

仲孙焱
2023-03-14

在Go中玩一些简单的代码时,我注意到使用bool数组而不是int数组(它只使用0/1的值)可以大大加快速度。

  • 函数使用布尔 - 1.397s
  • 函数使用国际 - 1.996s

我本来希望这两个编译器都能提供相同的性能,因为在机器级没有本机bool类型,所以我本来希望编译器能生成类似的汇编代码。

由于差异很大,我对这个结果的有效性表示怀疑。

我使用命令“go-build-filename.go”进行构建,但我不确定gcc的“-O3”的等效标志是什么。

func funcUsingBool(n int) int {
    if n < 1 { return 0 }

    notPrime := make([]bool, n+1)
    count := 1
    for i := 3; i < n; i = i + 2 {
        if notPrime[i] { continue }
        count++
        k := 2 * i
        for k <= n {
            notPrime[k] = true
            k += i
        }
    }
    return count
}

func funcUsingInt(n int) int {
    if n < 1 { return 0}

    notPrime := make([]int, n+1)
    count := 1
    for i := 3; i < n; i = i + 2 {
        if notPrime[i] == 1 { continue }
        count++
        k := 2 * i
        for k <= n {
            notPrime[k] = 1
            k += i
        }
    }
    return count
}

共有1个答案

虞裕
2023-03-14

查看汇编输出(< code > go run-GC flags '-S ' test . go )有一些不同:

布尔:

0x0075 00117 (test.go:11)   MOVBLZX (AX)(BX*1), DI
0x0079 00121 (test.go:11)   TESTB   DIB, DIB

int:

0x0075 00117 (test.go:28)   MOVQ    (AX)(BX*8), DI
0x0079 00121 (test.go:28)   CMPQ    DI, $1

Byte/uint8:

0x0075 00117 (test.go:28)   MOVBLZX (AX)(BX*1), DI
0x0079 00121 (test.go:28)   CMPB    DIB, $1

在Go 1.8.*上,组件的其余部分对我来说几乎相同。

因此:1)数据类型的大小不同2)操作不同

 类似资料:
  • 问题内容: 当我在大学时使用C ++时,我被告知要尽可能使用多维数组(因此称为MDA),因为它以较大的块分配,因此具有更好的内存局部性。另一方面,阵列数组(AoA)被分配为多个较小的块,可能分散在物理内存中发现空缺的所有位置。 所以我想第一个问题是:这是神话,还是值得遵循的建议? 假设是后者,那么下一个问题将是在没有真正MDA的Java之类的语言中做什么。当然,用1DA模拟MDA并不难。本质上,具

  • 这一数组属性返回一个包含数组维度的元组,它也可以用于调整数组大小。 输出如下: (2, 3) 示例 2 # 这会调整数组大小 import numpy as np a = np.array([[1,2,3],[4,5,6]]) a.shape = (3,2) 输出如下: [[1, 2] [3, 4] [5, 6]] NumPy 也提供了reshape函数来调整数组大小。 import n

  • 问题内容: 如何使数组易失?因为正如我所了解的那样,使数组易失是不安全的吗? 问题答案: 将数组声明为volatile并 不能 对其字段进行volatile访问。您是在声明引用本身是可变的,而不是元素。 换句话说,你声明 挥发性组 的元素,而不是一个 集易挥发元素 。 解决方案是在要使用整数的情况下使用。另一种方法(但有点难看)是每次您编辑字段时都将对数组的引用重写。 您可以这样做: (就像我说的

  • 主要内容:ndarray.shape,ndarray.reshape(),ndarray.ndim,ndarray.itemsize,ndarray.flags本节介绍 Numpy 数组的常用属性。 ndarray.shape shape 属性的返回值一个由数组维度构成的元组,比如 2 行 3 列的二维数组可以表示为 ,该属性可以用来调整数组维度的大小。 示例如下,输出了数组的维度: 输出结果: (2,3) 通过 shape 属性修改数组的形状大小:  输出结果: ndarray.reshape

  • 如果是,如果被添加到数组中,强制转换会受到什么影响?谢谢你! 编辑:@cacahuete Frito链接了一个非常相似的问题:带有'volatile'数组的'memcpy((void*)dest,src,n)'安全吗?

  • 有一个名为的类。 并且我有一个对象的数组。我现在需要的是将该数组中所有对象的s提取到一个新数组中。 我也发现了这个类似的问题。但是它是在Objective-C中的,所以它使用来实现这一点。 我怎么能在斯威夫特做到这一点呢?