我正在开发一个我希望在许可许可下发布的开源项目,因为它是一个库,而不是一个应用程序,而且就个人而言,我不喜欢copyleft的库代码.如果我浏览用不同编程语言编写的GPL代码只是为了大致了解如何做某事,然后用我正在使用的语言编写一个类似或相同算法的不同实现,那么可能会是什么后果?如果我的代码与他们的代码有些相似,并且明显受到他们的影响,那么copyleft所有者会有任何合理的投诉吗?这些灰色区域通常如何工作?
我决定找到2个功能的速度:
这是我的xstrcmp函数:
int xstrlen(char *str)
{
int i;
for(i=0;;i++)
{
if(str[i]=='\0')
break;
}
return i;
}
int xstrcmp(char *str1, char *str2)
{
int i, k;
if(xstrlen(str1)!=xstrlen(str2))
return -1;
k=xstrlen(str1)-1;
for(i=0;i<=k;i++)
{
if(str1[i]!=str2[i])
return -1;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我不想依赖strlen,因为我想要用户定义的所有内容.
所以,我找到了结果.strcmp每毫秒进行364次比较,而我的xstrcmp每毫秒只做20次比较(至少在我的电脑上!)
任何人都可以告诉为什么会这样吗?xstrcmp函数如何使自己如此之快?
放弃
strchr 需要一个以NUL结尾的字符串我正在寻找最快的方法来识别字节缓冲区中给定字节的第一次出现.
这让人联想到在字符串中第一次出现字符,除了:
string或中分配vector,我只传下一个切片(又名,指针和长度)基本解决方案是:
size_t search(char const* buffer, size_t length, char c) {
return std::find(buffer, buffer + length, c) - buffer;
}
Run Code Online (Sandbox Code Playgroud)
然而,使用Godbolt编译器(-O2 -msse2 -mavx)的快速往返并没有显示任何矢量化指令的暗示,只有一些展开,所以我想知道这是否是最优的.
有没有更快的方法来查找缓冲区中给定字节的第一次出现?
注意:只有第一次出现很重要.
注意:我只关心Linux上的现代x86_64 CPU,但我鼓励尽可能通用的答案并清楚地提及假设.