在Go中玩一些简单的代码时,我注意到使用bool数组而不是int数组(它只使用0/1的值)可以大大加快速度。
我本来希望这两个编译器都能提供相同的性能,因为在机器级没有本机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
}
查看汇编输出(< 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中的,所以它使用来实现这一点。 我怎么能在斯威夫特做到这一点呢?