为什么当我 return 方法的结果时 strlen 变慢?
Why is strlen slower when I return its results from a method?
我在业余时间为C++写一个字符串class。我不只是使用 std::string
是有充分理由的,但这不是本文的目的,当我说 std::string
不是这里的答案时请相信我。
在我的 header 只有字符串 class (UString) 我有:
inline size_t Length()
{
return strlen(rawString);
}
当我分析这个时,我得到:
String size retrieval times
CString: 53
UString: 605
std::string: 71
我的函数调用时间代码是:
timespec ts;
timespec ts2;
const char* s1 = "Hello World";
UString s2 = "Hello World";
std::string s3 = "Hello World";
std::cout << "String size retrieval times" << std::endl << std::endl;
std::cout << "CString: \t";
clock_gettime(CLOCK_REALTIME, &ts);
strlen(s1);
clock_gettime(CLOCK_REALTIME, &ts2);
std::cout << ts2.tv_nsec - ts.tv_nsec << std::endl;
std::cout << "UString: \t";
clock_gettime(CLOCK_REALTIME, &ts);
s1.Length();
clock_gettime(CLOCK_REALTIME, &ts2);
std::cout << ts2.tv_nsec - ts.tv_nsec << std::endl;
std::cout << "std::string: \t";
clock_gettime(CLOCK_REALTIME, &ts);
s3.size();
clock_gettime(CLOCK_REALTIME, &ts2);
std::cout << ts2.tv_nsec - ts.tv_nsec << std::endl;
当我将 Length 方法更改为:
inline size_t Length()
{
strlen(rawString);
return 0;
}
我得到:
String size retrieval times
CString: 57
UString: 80
std::string: 88
我在 Ubuntu 12.04 64 位 G++ 4.9.2
我正在编译 g++ -std=c++11 ustringtest.cpp -o stringtest -lrt
有什么想法吗?我很困惑。我的猜测是它与 return 类型有关,当我不是故意的时候我隐式地转换了一些东西,但我很确定 `st
如果编译器可以确定像 strlen
这样的函数的结果将仅以特定方式使用,它可能会替换其他足以满足此类目的的代码。例如,如果代码是
if (strlen(p) >= 2) ...
编译器可以合法地替换
if (p[0] && p[1]) ...
因为它在与原始情况完全相同的情况下都是正确的。同样,如果一个函数说...
return strlen("fred12345");
编译器可以合法地替换
return 9;
如果一个函数说
return strlen(p);
然而,除非编译器可以推断出 p
可能指向什么或可能对结果做什么,否则它必须调用搜索从 p
开始的字符的代码,直到它找到零字节。
我在业余时间为C++写一个字符串class。我不只是使用 std::string
是有充分理由的,但这不是本文的目的,当我说 std::string
不是这里的答案时请相信我。
在我的 header 只有字符串 class (UString) 我有:
inline size_t Length()
{
return strlen(rawString);
}
当我分析这个时,我得到:
String size retrieval times
CString: 53
UString: 605
std::string: 71
我的函数调用时间代码是:
timespec ts;
timespec ts2;
const char* s1 = "Hello World";
UString s2 = "Hello World";
std::string s3 = "Hello World";
std::cout << "String size retrieval times" << std::endl << std::endl;
std::cout << "CString: \t";
clock_gettime(CLOCK_REALTIME, &ts);
strlen(s1);
clock_gettime(CLOCK_REALTIME, &ts2);
std::cout << ts2.tv_nsec - ts.tv_nsec << std::endl;
std::cout << "UString: \t";
clock_gettime(CLOCK_REALTIME, &ts);
s1.Length();
clock_gettime(CLOCK_REALTIME, &ts2);
std::cout << ts2.tv_nsec - ts.tv_nsec << std::endl;
std::cout << "std::string: \t";
clock_gettime(CLOCK_REALTIME, &ts);
s3.size();
clock_gettime(CLOCK_REALTIME, &ts2);
std::cout << ts2.tv_nsec - ts.tv_nsec << std::endl;
当我将 Length 方法更改为:
inline size_t Length()
{
strlen(rawString);
return 0;
}
我得到:
String size retrieval times
CString: 57
UString: 80
std::string: 88
我在 Ubuntu 12.04 64 位 G++ 4.9.2
我正在编译 g++ -std=c++11 ustringtest.cpp -o stringtest -lrt
有什么想法吗?我很困惑。我的猜测是它与 return 类型有关,当我不是故意的时候我隐式地转换了一些东西,但我很确定 `st
如果编译器可以确定像 strlen
这样的函数的结果将仅以特定方式使用,它可能会替换其他足以满足此类目的的代码。例如,如果代码是
if (strlen(p) >= 2) ...
编译器可以合法地替换
if (p[0] && p[1]) ...
因为它在与原始情况完全相同的情况下都是正确的。同样,如果一个函数说...
return strlen("fred12345");
编译器可以合法地替换
return 9;
如果一个函数说
return strlen(p);
然而,除非编译器可以推断出 p
可能指向什么或可能对结果做什么,否则它必须调用搜索从 p
开始的字符的代码,直到它找到零字节。