void __fastcall TMainForm::BtnAddOneClick(TObject *Sender)
{
char Data[129]; // 数据缓冲区
int iBeginTime, // 计时开始的TickCount
iEndTime; // 运算结束的TickCount
AnsiString strResult; // 存放结果的累加字符串变量
memset(Data, 'A', sizeof(Data)-1); // 数据缓冲置为字符A
Data[sizeof(Data)-1] = 0; // 数据缓冲末尾置NULL
iBeginTime = GetTickCount(); // 记录开始时间,豪秒
for(int i=0;i<10000;i++) // 累加字符串10000次
strResult += Data;
iEndTime = GetTickCount(); // 记录结束时间,豪秒
// 显示运算时长,单位毫秒;三次结果分别为16812, 16750, 17656。
ResultMemo->Lines->Add(IntToStr(iEndTime - iBeginTime));
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::BtnAddTwoClick(TObject *Sender)
{
char Data[129]; // 数据缓冲区
int iBeginTime, // 计时开始的TickCount
iEndTime; // 运算结束的TickCount
AnsiString strTemp; // 存放临时数据
AnsiString strResult; // 存放结果的累加字符串变量
memset(Data, 'A', sizeof(Data)-1); // 数据缓冲置为字符A
Data[sizeof(Data)-1] = 0; // 数据缓冲末尾置NULL
strTemp = Data; // 使用临时字符串变量
iBeginTime = GetTickCount(); // 记录开始时间,豪秒
for(int i=0;i<10000;i++) // 累加字符串10000次
strResult += strTemp;
iEndTime = GetTickCount(); // 记录结束时间,豪秒
// 显示运算时长,单位毫秒;三次结果分别为15, 16, 16。
ResultMemo->Lines->Add(IntToStr(iEndTime - iBeginTime));
}
//---------------------------------------------------------------------------
初步结论是AnsiString在底层实现时有很大的问题(特别是内存管理),正常情况下,前后两种方式累加不应有这么大的差异的。
解决办法:在项目里加上著名的内存管理器FastMM,经实测重新编译后速度相当,几乎没有区别。另外可以考虑升级系统到C++Builder2006/2007(据说内置了FastMM内存管理器),经测试已没有性能上的区大差别。
所以强烈建议朋友们如果还是用C++Builder 6及以前版本的系统开发应用,一率加上FastMM。
{
char Data[129]; // 数据缓冲区
int iBeginTime, // 计时开始的TickCount
iEndTime; // 运算结束的TickCount
AnsiString strResult; // 存放结果的累加字符串变量
memset(Data, 'A', sizeof(Data)-1); // 数据缓冲置为字符A
Data[sizeof(Data)-1] = 0; // 数据缓冲末尾置NULL
iBeginTime = GetTickCount(); // 记录开始时间,豪秒
for(int i=0;i<10000;i++) // 累加字符串10000次
strResult += Data;
iEndTime = GetTickCount(); // 记录结束时间,豪秒
// 显示运算时长,单位毫秒;三次结果分别为16812, 16750, 17656。
ResultMemo->Lines->Add(IntToStr(iEndTime - iBeginTime));
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::BtnAddTwoClick(TObject *Sender)
{
char Data[129]; // 数据缓冲区
int iBeginTime, // 计时开始的TickCount
iEndTime; // 运算结束的TickCount
AnsiString strTemp; // 存放临时数据
AnsiString strResult; // 存放结果的累加字符串变量
memset(Data, 'A', sizeof(Data)-1); // 数据缓冲置为字符A
Data[sizeof(Data)-1] = 0; // 数据缓冲末尾置NULL
strTemp = Data; // 使用临时字符串变量
iBeginTime = GetTickCount(); // 记录开始时间,豪秒
for(int i=0;i<10000;i++) // 累加字符串10000次
strResult += strTemp;
iEndTime = GetTickCount(); // 记录结束时间,豪秒
// 显示运算时长,单位毫秒;三次结果分别为15, 16, 16。
ResultMemo->Lines->Add(IntToStr(iEndTime - iBeginTime));
}
//---------------------------------------------------------------------------
初步结论是AnsiString在底层实现时有很大的问题(特别是内存管理),正常情况下,前后两种方式累加不应有这么大的差异的。
解决办法:在项目里加上著名的内存管理器FastMM,经实测重新编译后速度相当,几乎没有区别。另外可以考虑升级系统到C++Builder2006/2007(据说内置了FastMM内存管理器),经测试已没有性能上的区大差别。
所以强烈建议朋友们如果还是用C++Builder 6及以前版本的系统开发应用,一率加上FastMM。