实战经验:CString.Format性能探究

实战经验:CString.Format性能探究

作者:BlogUpdater |  时间:2018-09-01 |  浏览:2660 |  评论已关闭 条评论

在编写性能攸关的应用的时候,往往会忽视一些看似普通函数的调用成本。今天以CString.Format为例进行探究。
在操作字符串时,我们会因为方便而选择使用CString对象,在格式化字符串时,我们会调用CString的Format方法。简单方便的背后,往往需要付出一定的代价。
我们来编写一个示例程序来说明。
首先在VS中创建一个控制台应用程序,编写以下三个函数,分别测试CString.Format,_tcscpy_s和_stprintf_s在大量调用的场景下的性能。

使用CString.Format

CString str(_T(""));
DWORD dwStart = GetTickCount();
for (int i = 0; i < 500000; i++)
{
	str.Format(_T("%s"), _T("Hello"));
}
DWORD dwEnd = GetTickCount();
printf("CString.Format: %d ms\n", dwEnd - dwStart);

使用_tcscpy_s

TCHAR arr[10] = {0};
DWORD dwStart = GetTickCount();
for (int i = 0; i < 500000; i++)
{
	_tcscpy_s(arr, 10, _T("Hello"));
}
DWORD dwEnd = GetTickCount();
printf("_tcscpy_s: %d ms\n", dwEnd - dwStart);

使用_stprintf_s

TCHAR arr[10] = {0};
DWORD dwStart = GetTickCount();
for (int i = 0; i < 500000; i++)
{
	_stprintf_s(arr, 10, _T("%s"), _T("Hello"));
}
DWORD dwEnd = GetTickCount();
printf("_stprintf_s: %d ms\n", dwEnd - dwStart);

测试结果

从以上测试结果中,我们看到耗时最久的是CString.Format方法,其次是_stprintf_s,性能最优者为_tcscpy_s。但是从编写程序的方便性来说,CString内建的字符串操作方法众多,语法也比较简单,开发效率会更胜一筹。
在编写性能攸关的程序时,如果仅仅是因为编写程序方便而是用CString.Format的话,那结果就是:你自己写程序写爽了,用户在使用你的程序时,根本就不是那么一回事。要么是运行缓慢,要么是界面卡顿,要么是内存使用量暴涨(对象基础设施中因为私有数据成员和虚函数表而消耗更多的内存)。

另外
为了避免Debug和Release模式下,调试基础设施对程序施加的影响,这里的示例工程没有使用Debug模式测试,而是直接使用Release模式,用于模拟真实的产品环境。

总结
1) 人的生命由一段时间组成,倘若你的产品毫无意义的消耗了你的用户的时间,就等于浪费了他(她)的生命。
2) 性能攸关的场合,宁愿写程序的时候累一点,也要保证性能最优化。
3) 享受到的抽象便利越多,背后付出的代价(可能)也会更大。

标签:

评论已关闭。