一、测试条件:
测试内容描述:
记录从启动搜狗音乐盒,到主程序界面的初始化工作完成所消耗的时间。
程序版本: | 搜狗音乐盒v1.1.0.47(Release) |
测试环境: | WinXP SP2 + Office2007 |
测试工具: | AQtime v5.40 |
起始时间点: | AfxWinMain的入口 |
终止时间点: | CSohuplayerDlg::OnInitDialog()执行完毕退出 |
硬件环境:
CPU | 2 * Intel(R) Pentium(R) D CPU 3.00GHz, Frequency: ~2992 MHz |
内存 | 2095144 Kb |
进程列表:
进程名称 | 备注 |
Rtvscan.exe | |
AQtime.exe | AQtime v5.40 |
ONENOTE.EXE | OFFICE 20007 NOTE |
Svhost.exe | |
OUTLOOK.EXE | OUTLOOK |
TM.EXE | TM2008 |
system | |
Sqlservr.exe | |
Msnmsgr.exe | MSN |
Csrss.exe | |
MSDEV.EXE | Visual C++ 6.0 |
VPTray.exe | |
ccApp.exe | |
Smss.exe | |
Explorer.exe | |
ONENOTEM.EXE | |
Winlogon.exe | |
Spoolsv.exe | |
SavRoam.exe | |
Smax4pnp.exe | |
Svhost.exe | |
TSVNCache.exe | SVN v1.5 |
Lsass.exe | |
Svchost.exe | |
Nutsrv4.exe | |
Svchost.exe | |
Services.exe | |
ccSetMgr.exe | |
TXPlatform.exe | |
DefWatch.exe | |
Sqlbrowser.exe | |
Usnsvc.exe | |
Svchost.exe | |
Alg.exe | |
Ctfmon.exe | |
ccEvtMgr.exe | |
Conime.exe | |
二、测试步骤:
1.配置VC6的编译信息:
1).Set Active Project Configuration:
2).在Project Settings | C/C++选项中,设置Debuginfo为Program Database.
3).在Project Settings | Link,选择Category为General,将Generate debug info复选框选中.
4).在Project Settings | Link,选择Category为Customize,在Program database name中填入PDB文件路径:
5).在Project Settings | Link,选择Category为Debug,勾选Debuginfo;去除Separate types。
至此准备工作已经完成,编译源代码。
2.配置AQTIME:
1).在AQtime中添加待测试程序和模块:
2).配置Area和Actions:
3.运行并得到测试结果:
AQtime Performance Profiler
Session information
Started: | 2008-7-8 20:50:20 |
Ended: | 2008-7-8 20:50:24 |
Execution time: | 00:00:03:891 |
Routines analyzed: | 6197 |
Routines executed: | 694 |
Total number of routine calls: | 8000 |
Total value of 'Elapsed Time': | 1608.46 |
Performance hot spots
All Threads
Worst performance (body only):
| 207.50 |
| 201.74 |
| 176.80 |
| 126.72 |
| 126.50 |
| 87.57 |
| 78.68 |
| 69.66 |
| 63.38 |
| 55.74 |
Run settings
Profiling mode: | Normal |
Host Application: | |
Parameters: | |
Work Directory: | |
Profiler options
Active counter: | Elapsed Time |
Thread model: | Win32 Threads |
Profile <Root> routine: | False |
Profile Entire .NET Code: | None |
Disable inlining: | False |
Profile .NET runtime: | False |
System information
Operating system: | Microsoft Windows XP Service Pack 2 (version: 5.1 Build 2600) |
Total physical memory: | 2095144 Kb |
Available physical memory: | 1322132 Kb |
Total virtual memory: | 2097024 Kb |
Available virtual memory: | 1800944 Kb |
Processor type: | Intel(R) Pentium(R) D CPU 3.00GHz, Frequency: ~2992 MHz. |
Number of processors: | 2 |
调用函数执行时间截图:(部分)
函数调用关系截图:(部分)
三、测试结果报告:
1.程序执行时间超过100毫秒的函数分别是:
函数名 | 执行时间 | 包含子函数的执行时间 | 备注 |
Cthread<CAdWorkThread>::tfunc | 207.50毫秒 | 208.60毫秒 | 主线程工作函数,忽略 |
CSohuplayerApp:InitInstance | 201.74毫秒 | 1191.30毫秒 | |
CDBOperater::InitLocalDataBase2 | 176.80毫秒 | 306.70毫秒 | |
CDownloadThreadBase::WinGetFileFromSvr | 126.72毫秒 | 126.78毫秒 | 发送HTTP请求等待时间 |
CDBOperater::GetCreateFields | 126.50毫秒 | 126.54毫秒 | |
2.因为主程序的初始化工作都是在CSohuplayerApp::InitInstance中完成的,所以由此函数作为分析入口,逐步展开分析:
由上图结果可以看到,InstallCrashReport()在正式发布版本中是不编译执行的,可忽略;AfxOleInit时间消耗并不大,可忽略;重点分析intnRespoinse = dlg.DoModal(),即音乐盒主窗口的实例化操作CSohuplayerDlg::OnInitDialog函数。
3)在AQTIME的Editor面板中,进一步分析主窗口初始化函数CSohuplayerDlg::OnInitDialog的各条语句运行时间,得到如下图:
找到2个时间消耗较大的函数:CreateChildWnd()和CDBOperater::Instance()->InitLocalDataBase(&m_db)
1).首先分析CDBOperater::InitLocalDataBase,因为其函数内部只是进一步地调用CDBOperater:InitLocalDataBase2,所以查看CDBOperater:InitLocalDataBase2的各条语句执行时间信息:
BOOLCDBOperater::InitLocalDataBase2(CDatabase* pdb)
// HitCount : 1
//Time : 176.80
//Time with Children : 306.70
{
CCriticalSectionGuardguard(&m_csDBGuard);
m_pdb = pdb;
DWORD dwAttr =::GetFileAttributes(m_strDBFile);
if ( 0xFFFFFFFF ==dwAttr )
{
if ( FALSE ==CreateMultiDirectory(m_strDBFile) )
{
return FALSE;
}
……
else
{
::CoInitialize(NULL);
CString strCNN =_T("rovider=Microsoft.JET.OLEDB.4.0;Data source = "); strCNN +=m_strDBFile;
_CatalogPtrpCatalog = NULL;
pCatalog.CreateInstance(__uuidof(Catalog));
if ( NULL ==pCatalog )
{
::CoUninitialize();
return FALSE;
}
pCatalog->utActiveConnection((LPCTSTR)strCNN);//耗时115.59毫秒
if (pCatalog->Tables->Count > 0 )
{
_variant_tvIndex((short)0);
_TablePtr pTable =pCatalog->Tables->GetItem(vIndex);
if ( NULL ==pTable )
{
::CoUninitialize();
return FALSE;
}
//"JetOLEDB:Compressed UNICODE Strings" can throw exception, ADO & MS Bug!!!
ChangeColumnProperty(pTable,"Song","JetOLEDB:Allow Zero Length",true);
ChangeColumnProperty(pTable,"Artist","JetOLEDB:Allow Zero Length",true);
ChangeColumnProperty(pTable,"Album","JetOLEDB:Allow Zero Length",true);
ChangeColumnProperty(pTable,"Type","JetOLEDB:Allow Zero Length",true);
}
::CoUninitialize();
m_pdb->OpenEx(m_strDsn,CDatabase::noOdbcDialog);//耗时37.66毫秒
CList<CString,CString>listCreateFields;
GetCreateFields(&listCreateFields);//耗时126.54毫秒
if (listCreateFields.GetCount() > 0 )
{
CreateNewFields(&listCreateFields);
}
….
分析:
可以看到时间消耗主要在上面粗体字显示的三个函数。pCatalog->utActiveConnection((LPCTSTR)strCNN)是调用的第三方XTPCalendarADO的方法,所以没有办法进一步追踪;m_pdb->OpenEx(m_strDsn,CDatabase::noOdbcDialog)是调用MFC中CDataBase的方法,因此也没有办法进一步追踪。而GetCreateFields(&listCreateFields)可以进一步追踪:
GetCreateFields(&listCreateFields):
// HitCount : 1
//Time : 156.56
//Time with Children : 156.59
voidCDBOperater::GetCreateFields(CList<CString,CString>* plistCreateFields)
{
plistCreateFields->AddTail("Idx");
…...
CRecordsetrs(m_pdb);
CODBCFieldInfo fi;//144.32毫秒
rs.Open(CRecordset::forwardOnly,"SELECT* FROM AudioIndex WHERE Type = \'aaa\'",CRecordset::readOnly);
int nFCount =rs.GetODBCFieldCount();
while(nFCount)
{
…….
nFCount--;
}
rs.Close();
}
分析:
时间主要消耗在CODBCFieldInfo类实例化的对象fi的过程中。
2).其次分析CreateChildWnd函数:
BOOLCSohuplayerDlg::CreateChildWnd()
// HitCount : 1
//Time : 11.87
//Time with Children : 382.62
…...
m_dlgPlayer.Create(NULL, NULL,WS_CHILD|WS_VISIBLE, CRect(0, 0, 0, 0), this, IDC_PLAYER_WND_ID);//耗时115.15毫秒
……
m_dlgAudioGroup.Create(IDD_MUSICCENTER_DIALOG,&m_ctrlTab);//耗时262.04毫秒
….
}
分析:
· m_dlgPlayer是CSohuPlayer的成员变量,执行m_dlgPlayer.create即实例化m_dlgPlayer的过程。查看CDlgPlayer的子函数调用关系图,可以看到最终时间消耗在创建WMP控件的过程中。
· 消耗在m_dlgAudoGroup.Create的262.04毫秒中,有250.21毫秒是消耗在CMusicCenterDlg::OnInitDialog过程中,如下:
BOOLCMusicCenterDlg::OnInitDialog()
// HitCount : 1
//Time : 0.99
//Time with Children : 250.21
{
m_downloadListManage.SetMusicCenter(this);
m_auditionManage.SetMusicCenter(this);
m_playListManage.SetMusicCenter(this);
m_searchListManage.SetMusicCenter(this);
m_playmusicManage.SetMusicCenter(this);
CMusicCenterDlgBase::OnInitDialog();
::ShowWindow(GetDlgItem(IDC_CHECK_SONG)->GetSafeHwnd(),SW_HIDE);
DWORD dwSL = 1;
CPublicFun::GetSearchSL(dwSL);
((CButton*)GetDlgItem(IDC_CHECK_SONG))->SetCheck(dwSL);
…..
InitMusicCenter(); | //56.12毫秒,占总时间消耗.22.43% |
InitMusicPlayInfo(); | //2.18毫秒,占总时间消耗0.87% |
InitMusicLyric(); | //47.20毫秒,占总时间消耗18.86% |
InitMusicButtonEx(); | //52.59毫秒,占总时间消耗21.02% |
InitMusicSlider(); | //18.26毫秒,占总时间消耗7.30% |
InitMusicList(); | //10.43毫秒,占总时间消耗4.17% |
InitMusicExplorer(); | //55.78毫秒,占总时间消耗22.29% |
…..
四、结果:
CDBOperater:InitLocalDataBase2函数内的pCatalog->utActiveConnection((LPCTSTR)strCNN),影响启动时间较大,有优化的可能。
搜狗音乐盒网络歌曲列表加载性能测试
2008年7月9日
10:25
一、测试条件:
测试内容描述:
当程序运行时,记录用户点击程序窗口左侧的"音乐排行榜"->"热门单曲",到歌曲列表被插入到列表控件的时间(不包含界面刷新的时间)。
程序版本: | 搜狗音乐盒v1.1.0.47(Release) |
测试环境: | WinXP SP2 + Office2007 |
测试工具: | AQtime v5.40 |
起始时间点: | CPersistentTreeCtrl::OnSelchangeingTree入口 |
终止时间点: | CMusicCenterDlg:oadSearchUrlFromBuffer出口 |
硬件环境:
CPU | 2 * Intel(R) Pentium(R) D CPU 3.00GHz, Frequency: ~2992 MHz |
内存 | 2095144 Kb |
进程列表:
进程名称 | 备注 |
Rtvscan.exe | |
AQtime.exe | AQtime v5.40 |
ONENOTE.EXE | OFFICE 20007 NOTE |
Svhost.exe | |
OUTLOOK.EXE | OUTLOOK |
TM.EXE | TM2008 |
system | |
Sqlservr.exe | |
Msnmsgr.exe | MSN |
Csrss.exe | |
MSDEV.EXE | Visual C++ 6.0 |
VPTray.exe | |
ccApp.exe | |
Smss.exe | |
Explorer.exe | |
ONENOTEM.EXE | |
Winlogon.exe | |
Spoolsv.exe | |
SavRoam.exe | |
Smax4pnp.exe | |
Svhost.exe | |
TSVNCache.exe | SVN v1.5 |
Lsass.exe | |
Svchost.exe | |
Nutsrv4.exe | |
Svchost.exe | |
Services.exe | |
ccSetMgr.exe | |
TXPlatform.exe | |
DefWatch.exe | |
Sqlbrowser.exe | |
Usnsvc.exe | |
Svchost.exe | |
Alg.exe | |
Ctfmon.exe | |
ccEvtMgr.exe | |
Conime.exe | |
二、测试步骤:
1.配置VC6的编译信息:
2.配置AQTIME:
3.运行并得到测试结果:
AQtime Performance Profiler
Session information
Started: | 2008-7-9 16:09:19 |
Ended: | 2008-7-9 16:09:27 |
Execution time: | 00:00:08:031 |
Routines analyzed: | 6197 |
Routines executed: | 92 |
Total number of routine calls: | 4364 |
Total value of 'Elapsed Time': | 40.79 |
Performance hot spots
All Threads
Worst performance (body only):
| 7.70 |
| 5.13 |
| 4.14 |
| 3.61 |
| 3.47 |
| 3.26 |
| 2.73 |
| 2.31 |
| 1.34 |
| 1.19 |
Worst performance (with children):
Routine with max HitCount:
Win32 Thread 4920
Run settings
Profiling mode: | Normal |
Host Application: | |
Parameters: | |
Work Directory: | |
Profiler options
Active counter: | Elapsed Time |
Thread model: | Win32 Threads |
Profile <Root> routine: | False |
Profile Entire .NET Code: | None |
Disable inlining: | False |
Profile .NET runtime: | False |
System information
Operating system: | Microsoft Windows XP Service Pack 2 (version: 5.1 Build 2600) |
Total physical memory: | 2095144 Kb |
Available physical memory: | 1281352 Kb |
Total virtual memory: | 2097024 Kb |
Available virtual memory: | 1827216 Kb |
Processor type: | Intel(R) Pentium(R) D CPU 3.00GHz, Frequency: ~2992 MHz. |
Number of processors: | 2 |
三、分析:
网络歌曲列表加载的时间主要集中在网络传输速度,而程序本身的执行时间所占比率非常短。提升此功能的突破点主要在提升网络传输的速度。
搜狗音乐盒界面刷新性能测试
2008年7月9日
10:25
一、测试条件:
测试内容描述:
当程序运行时,用户随意放大和缩小窗体,记录绘图函数所用的平均时间。
程序版本: | 搜狗音乐盒v1.1.0.47(Release) |
测试环境: | WinXP SP2 + Office2007 |
测试工具: | AQtime v5.40 |
硬件环境:
CPU | 2 * Intel(R) Pentium(R) D CPU 3.00GHz, Frequency: ~2992 MHz |
内存 | 2095144 Kb |
进程列表:
进程名称 | 备注 |
Rtvscan.exe | |
AQtime.exe | AQtime v5.40 |
ONENOTE.EXE | OFFICE 20007 NOTE |
Svhost.exe | |
OUTLOOK.EXE | OUTLOOK |
TM.EXE | TM2008 |
system | |
Sqlservr.exe | |
Msnmsgr.exe | MSN |
Csrss.exe | |
MSDEV.EXE | Visual C++ 6.0 |
VPTray.exe | |
ccApp.exe | |
Smss.exe | |
Explorer.exe | |
ONENOTEM.EXE | |
Winlogon.exe | |
Spoolsv.exe | |
SavRoam.exe | |
Smax4pnp.exe | |
Svhost.exe | |
TSVNCache.exe | SVN v1.5 |
Lsass.exe | |
Svchost.exe | |
Nutsrv4.exe | |
Svchost.exe | |
Services.exe | |
ccSetMgr.exe | |
TXPlatform.exe | |
DefWatch.exe | |
Sqlbrowser.exe | |
Usnsvc.exe | |
Svchost.exe | |
Alg.exe | |
Ctfmon.exe | |
ccEvtMgr.exe | |
Conime.exe | |
二、配置AQTIME的Profiler参数:
三、测试结果单位是微秒)
四、分析:
1.CPublicFun::CreateDirectoryExA:
由上面调用关系图可以看到在每次执行CPersistentListCtrl::CustomDrawSearhList时,都会执行CPublicFun::GetTempMusicPath,此函数的作用是获取下载音乐临时目录,如果不存在则创建。推测这里是一个性能瓶颈点。
Static CString strTmpMusic =CPublicFun::GetTempMusicPath()用法在整个工程中有26处调用,分别是
D:\Project\sohuplayer\LoginDlgVC6Dlg.cpp(1070):
D:\Project\sohuplayer\MCAuditionManage.cpp(68):
D:\Project\sohuplayer\MCAuditionManage.cpp(232):
D:\Project\sohuplayer\MCDownloadListManage.cpp(209):
D:\Project\sohuplayer\MCDownloadListManage.cpp(633):
D:\Project\sohuplayer\MusicCenterDlg.cpp(924):
D:\Project\sohuplayer\MusicCenterDlg.cpp(7498):
D:\Project\sohuplayer\MusicCenterDlg.cpp(7874):
D:\Project\sohuplayer\MusicCenterDlg.cpp(8911):
D:\Project\sohuplayer\MusicCenterDlg.cpp(8983):
D:\Project\sohuplayer\MusicCenterDlg.cpp(9018):
D:\Project\sohuplayer\MusicCenterDlg.cpp(9928):
D:\Project\sohuplayer\MusicCenterDlg.cpp(11404):
D:\Project\sohuplayer\MusicCenterDlg.cpp(12448):
D:\Project\sohuplayer\MusicCenterDlg.cpp(13156):
D:\Project\sohuplayer\PersistentListCtrl.cpp(761):
D:\Project\sohuplayer\PersistentListCtrl.cpp(1061):
D:\Project\sohuplayer\PersistentListCtrl.cpp(1090):
D:\Project\sohuplayer\PersistentListCtrl.cpp(2542):
D:\Project\sohuplayer\PersistentListCtrl.cpp(2745):
D:\Project\sohuplayer\PersistentListCtrl.cpp(2906):
D:\Project\sohuplayer\PersistentListCtrl.cpp(4290):
D:\Project\sohuplayer\PersistentListCtrl.cpp(5385):
D:\Project\sohuplayer\PersistentListCtrl.cpp(6129):
D:\Project\sohuplayer\Public.cpp(237):
D:\Project\sohuplayer\WndContainer.cpp(993):