英文:
Efficient way to rotate a slice in golang
问题
我需要一个能够高效地反转golang切片的函数。(我具体的需求是反转[]byte的前缀)。
我查看了Effective Go中的示例,并使用objdump -Sd
进行了检查,发现生成了大量用于检查数组索引的样板代码。甚至交换操作也不够高效。
英文:
I need a function to efficiently reverse a slice in golang. (My concrete need is to reverse the prefix of a []byte).
I checked the example from Effective Go with objdump -Sd
and a lot of boiler plate is generated to check for array indexes. Even the swap is too inefficient.
答案1
得分: 6
首先,我必须说一下:首先是个人资料。这真的是你代码中的瓶颈吗?如果是的话,你有几个选择。
1)禁用边界检查。我认为有一个未记录的编译器标志可以关闭切片边界检查。不过我现在找不到它了。(根据 OP 的说法,是 -B
)。
2)用 C(或汇编)编写程序,你可以为 [586]c 编写 C 代码,并将其链接到你的 Go 包中(你需要包含一些来自 $GOROOT/src/pkg/runtime
的头文件),如下所示:
#include "runtime.h"
mypackage·swapslice(Slice s) {
int i, j;
//不是真正的交换循环
for (i = 0, j = s.len - 1; i < j; i++, j--)
//交换 s.arr[i] 和 s.arr[j];
}
英文:
Firstly, I have to say it: Profile first. Is this really a bottleneck in your code? If it is, you have a few options.
-
Disable bounds checking. I think there's an undocumented compiler flag that turns of slice bounds checking. I can't find it at the moment though. (EDIT:
-B
according to OP). -
Write the routine in C (or assembler), you can write C for [586]c and link in your go package (you'll need to include some headers from
$GOROOT/src/pkg/runtime
), like so:#include "runtime.h"
mypackage·swapslice(Slice s) {
int i, j;
//Not a real swap loop
for (i = 0, j = s.len - 1; i < j; i++, j--)
//swap s.arr[i] and s.arr[j];
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论