gpt4 book ai didi

c++ - 将 std::string 转换为大写:主要性能差异?

转载 作者:可可西里 更新时间:2023-11-01 17:04:19 26 4
gpt4 key购买 nike

所以我正在研究一些代码,想看看将 std::string 转换为大写的哪种方法最有效。我认为两者在性能方面会有些相似,但我大错特错了。现在我想找出原因。

转换字符串的第一种方法如下:对于字符串中的每个字符(保存长度,从 0 迭代到长度),如果它在 'a' 和 'z' 之间,则将其移位,使其介于改为“A”和“Z”。

第二种方法的工作原理如下:对于字符串中的每个字符(从 0 开始,继续直到遇到空终止符),应用内置的 toupper() 函数。

代码如下:

#include <iostream>
#include <string>

inline std::string ToUpper_Reg(std::string str)
{
for (int pos = 0, sz = str.length(); pos < sz; ++pos)
{
if (str[pos] >= 'a' && str[pos] <= 'z') { str[pos] += ('A' - 'a'); }
}

return str;
}

inline std::string ToUpper_Alt(std::string str)
{
for (int pos = 0; str[pos] != '\0'; ++pos) { str[pos] = toupper(str[pos]); }

return str;
}


int main()
{
std::string test = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~!@#$%^&*()_+=-`'{}[]\\|\";:<>,./?";

for (size_t i = 0; i < 100000000; ++i) { ToUpper_Reg(test); /* ToUpper_Alt(test); */ }

return 0;
}

第一种方法 ToUpper_Reg 每 1 亿次迭代花费大约 169 秒
第二种方法 Toupper_Alt 每 1 亿次迭代花费大约 379 秒

什么给了?


编辑: 我更改了第二种方法,使其像第一种方法一样迭代字符串(将长度放在一边,在小于长度的情况下循环)并且速度更快一些,但仍然大约两倍一样慢。


编辑 2: 感谢大家的提交!我将使用它的数据保证是 ascii,所以我想我暂时会坚持使用第一种方法。我会记住 toupper 是特定于我何时/是否需要的语言环境。

最佳答案

std::toupper使用当前语言环境进行大小写转换,这涉及函数调用和其他抽象。所以自然会慢一些。但它也适用于非 ASCII 文本。

关于c++ - 将 std::string 转换为大写:主要性能差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9507895/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com