我有一个功能,我想为amd64
架构提供一个程序集实现。为了便于讨论,我们假设它是一个
Add
函数,但实际上它比这更复杂。我的程序集版本可以正常工作,但我的问题是让 godoc 正确显示。我有一种感觉,这是目前不可能的,但我想寻求建议。
更多细节:
- 该函数的汇编实现只包含几条指令。特别是,调用函数的成本是整个成本的重要组成部分。
- 它使用特殊指令 (
BMI2
),因此只能在CPUID
能力检查之后使用。
实现的结构类似于这个 gist。在高水平:
- 在通用(非
amd64
情况)中,该函数是通过委托给 来定义的addGeneric
。 - 在
amd64
函数实际上是一个变量的情况下, 如果 检查通过,最初设置为但在函数中addGeneric
替换为。addAsm
init
cpuid
这种方法有效。但是,godoc 输出很糟糕,因为在这种
amd64
情况下,函数实际上是一个变量。注意 godoc 似乎正在使用与其运行的机器相同的构建标签。我不确定godoc.org
会做什么。
考虑的替代方案:
- 该
Add
函数委托给addImpl
. 然后我们拉一些类似addImpl
的技巧来替换amd64
案例。这个问题是(在我的实验中)Go 似乎无法内联调用,并且程序集现在包含在两个函数调用中。由于组件已经很小,这对性能有显着影响。 - 在这种
amd64
情况下,我们定义了一个简单的函数Add
,其中包含检查,并根据结果useAsm
调用其中一个和。这将对性能产生更严重的影响。addGeneric
addAsm
所以我想问题是:
- 有没有更好的方法来构建代码以实现我想要的性能,并让它在文档中正确显示。
- 如果没有其他选择,还有其他方法可以“欺骗”godoc吗?