1
19
字符串函数供您使用。如果需要比较两个字符串,请调用
首先,要回答有关性能的任何问题,如果您问“多少优化将…”,答案是“配置文件!”没人能预测出什么东西跑得有多快。c stdlib的实现已经在 年 ,任何你试图想出的优化技巧都可能会伤害它。 例如,我认为gcc在比较字符串时会使用矢量化,所以实际上您一次要比较4-8个元素。你在等吗?做你的单字比较实际上可能会减慢速度。 也就是说,一个典型的实现只是检查字符,所以您只需将一个比较移出循环,就不会获得净收益。(但如前所述,可能是净损失!) 因此,指导方针是:
优化合理的方法:用证据和测试,而不是猜测。 |
2
7
担心
优化器可能没有意识到它可以并且应该避免每次循环迭代时的函数调用-如果您增加
很久以前,我使用的函数
另一个常见的缓慢的来源是使用
通常,这些实际上并不是性能问题的根源——但在没有相反证据的情况下,它可能是缓冲区溢出的根源。你需要知道长度足够小
这就节省了在添加新材料之前重复扫描已知长度的字符串以查找结尾的时间。对于短字符串,这并不重要;对于长字符串和许多连接操作,这可能很重要。和以前一样,关键是衡量成本。
Kernighan和Pike有一个有趣的故事,讲的是如何提高书中垃圾邮件过滤器的性能。
he Practice of Programming
'.它开始使用
|
3
4
它不会提供任何优化,因为这正是strcmp()所做的。 一般来说,由于str…()函数的使用量很大,所以您可以依赖库编写器尽可能高效地实现它们。只有在您编写了自己使用这些函数的代码,发现有问题,并使用探查器跟踪它之后,才应该考虑编写替换代码。 |
4
1
学习 glibc implementation of strlen 以下内容:
|
5
1
你可能对 this article (乔尔·斯波斯基)这是关于低级(尤其是C字符串)函数以及它们是如何优化的。 |
6
1
与其他答案相反,关于你的陈述:
我想这是一个 杰出的 想法。所以,我们应该这样做:
但是,为什么停在那里?我们应该再检查一个字符,以便更好地优化:
当然,我们可以做得更好。让我们将要比较的字符数设为一个参数:
但是,如果我们要把前几个字符进行比较,那么为什么不自己来做呢?所以,这里是最后一个完全优化的版本:
在写了我们的版本之后,我们很高兴地发现它是 identical 到P.J.Plauger的版本 标准C库 (当然,它也避免了好的库会使用的任何特定于体系结构的优化)!
换句话说,正如其他人所说,提前优化是没有意义的。 注释 :我还没有真正检查上面的代码片段是否正确。避免重新发明轮子的另一个原因是:你必须自己努力工作! |
7
0
乔纳森是绝对正确的,尤其是
你说的是微观优化,这是在你不这样做之后应该担心的事情。
tuned the blazes out of the code
.在调用前比较第一个字符
|
8
0
标准的C运行时字符串是非常优化的。除了利用C-Runtime所不具备的关于问题域的知识之外,您不太可能改进它。 你关于预测试第一个字符的想法有一些优点——如果你的大多数比较都是在不同的字符串之间进行的。(即大多数都会失败)。在这种情况下,可以避免函数调用的开销。 但是,比较匹配的字符串会更昂贵! 当给定匹配的字符串时,strcmp是最昂贵的。因此,如果您的算法将传递相同的指针作为strcmp的两个参数,您可以通过首先比较指针进行优化。只有您才能知道您的代码是否真的会经常这样做,值得这样做。
我唯一的建议是:不要使用
|
9
0
C标准库很好,因为它非常优化。一些编译器内嵌CRT函数,这样可以节省调用指令的开销。 但是,如果您仍然想要更高的速度,有几个选项可用。如果您访问我给您的这个链接,您将能够下载一个程序,它包含一些由专业汇编语言程序员编写的strcmp例程。 http://www.masm32.com/board/index.php?topic=2508.0 我特别想看看论坛成员Lingo写的功能。这家伙写了我见过的最快的汇编代码。 如果您不知道如何在C程序中使用汇编语言函数,只需再问一个stackoverflow问题,许多人(包括我)都可以帮助您。 下面是比较字符串abcdefg和abcz时得到的结果
从时钟的数量来看(越少越好),其他函数的速度就快得多。 |
10
0
是的:不要担心哪个库函数比其他函数快或慢,也不要担心如何在微观上将它们调整得更快(或更慢!).相反,找到能让你最清楚地表达你的意图的功能。
最后,如果您有证据表明您的应用程序速度太慢,那么您可以分析并查看字符串函数是否与您的问题有关。如果改进更可能来自像Boyer Moore这样的次线性算法,而不是通过调整
迈克尔A.杰克逊的两条优化规则:
|
11
0
我认为重要的一点是,每个与字符串相关的存储库/数据库可能都有其自身的特性,这些特性可以被操作或用于创建最佳的字符串操作函数。 然而,在本文中,有些场合有一些简单的技巧-您可以选择适合您需要的并使用它: http://www.codemaestro.com/articles/21 |
Community wiki · C中有哪些耗时的操作? 1 年前 |
Community wiki · 将所有处理器电源都投入到任务中 1 年前 |
Community wiki · C++为C添加了什么?[已关闭] 1 年前 |
Community wiki · 打印1到1000,不带循环或条件 1 年前 |