讨论:A / W 版MFC运行速度

worldy 2013-10-12 06:21:35
加精
使用MFC创建了A版和W版两个版本的代码,实现完全相同的功能
A版:
void CLogin::OnEnKillfocusServer()
{
// TODO: 在此添加控件通知处理程序代码
#ifdef _DEBUG
CString s;
CString s1;
int t=GetTickCount();
#endif

CString sIP;
m_Server.GetWindowText(sIP);

theDataCentry.LoadServer(sIP.GetBuffer());
if (theDataCentry.TxServer == NULL)
{
return;
}

_RecordsetPtr rs=theDataCentry.TxServer->GetAccountList();
#ifdef _DEBUG
s.Format(_T("The time of Load Data is %d ms\n"),GetTickCount()-t);
#endif
m_Account.ResetContent(); //m_Account 为CComboBox类
m_Account.SetDroppedWidth(30);

if (rs->RecordCount>0)
{
rs->MoveFirst();
while (!rs->adoEOF)
{
FieldPtr fld=rs->GetFields()->Item["AccountName"];

BSTR bs=fld->GetValue().bstrVal;
char* px;
UnicodeToAnsi(bs,&px);

int idx=m_Account.AddString((LPCTSTR)px);
CoTaskMemFree(px);

fld=rs->GetFields()->Item["KeyID"];

long KeyID=(long)fld->Value.lVal;
//LPSTR pc=NULL;
//UnicodeToAnsi((LPWSTR)fld->Value.pbstrVal,&pc);

if (idx!=CB_ERR)
{
m_Account.SetItemData(idx,KeyID);
}
rs->MoveNext();
}
}
#ifdef _DEBUG
t=GetTickCount()-t;
s1.Format(_T("The time of total is %d ms\n"),t);
TRACE(s);
TRACE(s1);
#endif
}


W版:
void CLogin::OnEnKillfocusServer()
{
// TODO: 在此添加控件通知处理程序代码

#ifdef _DEBUG
CString s;
CString s1;
int t=GetTickCount();
#endif

CString sIP;
m_Server.GetWindowText(sIP);

theDataCentry.LoadServer(sIP);
if (theDataCentry.TxServer == NULL)
{
return;
}

_RecordsetPtr rs=theDataCentry.TxServer->GetAccountList();

#ifdef _DEBUG
s.Format(_T("The time of Load Data is %d ms\n"),GetTickCount()-t);
#endif

m_Account.ResetContent();
//m_Account.SetDroppedWidth(30);

//BSTR acName=SysAllocString(_T("AccountName"));
if (rs->RecordCount>0)//本测试加载的只有10条数据
{
rs->MoveFirst();
while (!rs->adoEOF)
{
FieldPtr fld=rs->GetFields()->Item[_T("AccountName")];

BSTR bs=fld->GetValue().bstrVal;
char* px;
//UnicodeToAnsi(bs,&px);

int idx=m_Account.AddString(bs);//((LPCTSTR)px);
//CoTaskMemFree(px);

//fld=rs->GetFields()->Item[cKeyID];
long KeyID=(long)rs->GetCollect(cKeyID);//fld->Value;
//LPSTR pc=NULL;
//UnicodeToAnsi((LPWSTR)fld->Value.pbstrVal,&pc);

if (idx!=CB_ERR)
{
m_Account.SetItemData(idx,KeyID);
}
rs->MoveNext();
}
}
#ifdef _DEBUG
t=GetTickCount()-t;
s1.Format(_T("The time of total is %d ms\n"),t);
TRACE(s);
TRACE(s1);
#endif



其运行时间相差很大,并且都比VB6相同功能的代码慢,三者连接的服务器(服务器层程序)完全相同

debug运行结果:
A版:
The time of Load Data is 375 ms
The time of total is 406 ms


W版:
The time of Load Data is 390 ms
The time of total is 609 ms

VB debug运行,总时间 344 ms

多次运行结果有偏差,但都在上述结果附近

请各位高手谈谈看法。

...全文
2434 53 打赏 收藏 转发到动态 举报
写回复
用AI写文章
53 条回复
切换为时间正序
请发表友善的回复…
发表回复
waphj 2013-10-18
  • 打赏
  • 举报
回复
刚刚看了下release版本的反汇编代码,反汇编后代码也是一样的,直接将AddString替换为SendMessage的调用了,这样看来,还真有可能是api速度慢的原因了。
waphj 2013-10-18
  • 打赏
  • 举报
回复
代码跟进去后,发现AddString函数实现代码就一行,就是调用了SendMessage,然后发送的CB_GETLBTEXTLEN消息,不过在Release下相差倒是不多,Debug下速度差了比较多,难道是SendMessage数据多了一倍导致的。。。
waphj 2013-10-18
  • 打赏
  • 举报
回复
引用 7 楼 worldy 的回复:
[quote=引用 4 楼 hdt 的回复:] 但你是要从数据库里面读啊,磁盘或网络的吞吐量绝对无法跟内存相比
忘记说明了,VB是VB6,难道MFC比VB6慢?这说不过去啊,还是代码有哪些地方需要优化?[/quote] vb6编译生成exe执行,不适用解释执行模式,速度也不见得很慢,基本点语句速度不会差的。
worldy 2013-10-16
  • 打赏
  • 举报
回复
引用 49 楼 china_jeffery 的回复:
不必要纠结与这些,单步跟踪进去看看什么都知道了
VS2008的跟不进去啊,是否可以设置什么参数,能跟踪进去?谢谢
china_jeffery 2013-10-16
  • 打赏
  • 举报
回复
不必要纠结与这些,单步跟踪进去看看什么都知道了
worldy 2013-10-16
  • 打赏
  • 举报
回复
引用 47 楼 superliu1122 的回复:
[quote=引用 26 楼 worldy 的回复:] 致各位朋友: 已经有点眉目了,问题出在idx=m_Account.AddString((TCHAR*)bs)上 另外建立个工程,运行以下代码 void CMyTestPrj2View::OnTestAddstring() { .... TRACE(cs); } 按A版编译:The Time used is 0 ms 按W版编译:The Time used is 47 ms 可见,差别相当明显,请各位继续发表高见
经测试,这个时间是消耗在窗口的显示过程上,在Create后加上TxCombo.ShowWindow(SW_SHOW);则两个版本都是0ms[/quote] 我真是晕了,加上了ShowWindow,U版还是慢,还是要30都ms,A版的还是0; 难道我的MFC运行库真有问题?
superliu1122 2013-10-16
  • 打赏
  • 举报
回复
引用 26 楼 worldy 的回复:
致各位朋友: 已经有点眉目了,问题出在idx=m_Account.AddString((TCHAR*)bs)上 另外建立个工程,运行以下代码 void CMyTestPrj2View::OnTestAddstring() { if (TxCombo.m_hWnd==0) { RECT r={10,50,300,300}; TxCombo.Create(WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,r,this,1000); } int t=GetTickCount(); TxCombo.ResetContent(); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); CString cs; cs.Format(_T("The Time used is %d ms\n"),GetTickCount()-t); TRACE(cs); } 按A版编译:The Time used is 0 ms 按W版编译:The Time used is 47 ms 可见,差别相当明显,请各位继续发表高见
经测试,这个时间是消耗在窗口的显示过程上,在Create后加上TxCombo.ShowWindow(SW_SHOW);则两个版本都是0ms
欢乐马_19e9 2013-10-16
  • 打赏
  • 举报
回复
引用 38 楼 super_admi 的回复:

	// TODO: 在此添加控件通知处理程序代码
	int begin = GetTickCount();
	CString strValue = _T("");
	cbbTesting.ResetContent();
	for(int i = 0; i < 1000000; i++)
	{
		strValue.Format(_T("测试"));
		//cbbTesting.AddString(strValue);
	}
	int s_end = GetTickCount();
	strTesting.Format(_T("%d"), s_end - begin);
	UpdateData(FALSE);
	//OnOK();
U版最快:120+ A版最快:180+ 明显UNICODE版本要快。楼主之所以A版要快,完全是COMBOBOX的问题。我怀疑COMBOBOX控件中有W2A转换。
+1
qiuge062 2013-10-15
  • 打赏
  • 举报
回复
顶。。。。。
康斯坦汀 2013-10-15
  • 打赏
  • 举报
回复
不用比,贴近机器和操作系统的肯定快,所以C一定比C++快,C++一定比VB快。 但是,如果方法不对,就会得出错误的结论。 比如C++访问数据库如果采用数据库的API肯定比采用ADO或者ODBC的VB快。但是如果VC 采用ADO什么的就不比VB快多少,因为ADO本来就不是给VC访问数据库开发的。 写的不好的C++代码会比VB或者C#,Java写的慢几个数量级,这完全有可能。 以上纯水,不爱看可无视。
许文君 2013-10-14
  • 打赏
  • 举报
回复
唔,忘了问LZ是什么编译器?VC6?
许文君 2013-10-14
  • 打赏
  • 举报
回复
引用 26 楼 worldy 的回复:
[quote=引用 24 楼 clever101 的回复:] 不知道你是怎么测试的?有使用虚拟机吗?我建议在虚拟机测试,a版测试关闭虚拟机再重新启动虚拟机测试w版。
引用 19 楼 Reice91 的回复:
学习了呦好厉害
引用 17 楼 zcnvnv 的回复:
W版肯定是会更快的,绝大多数的A版API实际都是转换后调用W版 可能是你的某些其他代码导致 你用你这段代码要测试A/W版速度区别不科学
引用 11 楼 skyworth98 的回复:
建议用profiler查看各个函数的执行时间,应该就可以找到答案了
引用 2 楼 hdt 的回复:
莫非w传送的数据是a的两倍造成?
致各位朋友: 已经有点眉目了,问题出在idx=m_Account.AddString((TCHAR*)bs)上 另外建立个工程,运行以下代码 void CMyTestPrj2View::OnTestAddstring() { if (TxCombo.m_hWnd==0) { RECT r={10,50,300,300}; TxCombo.Create(WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,r,this,1000); } int t=GetTickCount(); TxCombo.ResetContent(); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); CString cs; cs.Format(_T("The Time used is %d ms\n"),GetTickCount()-t); TRACE(cs); } 按A版编译:The Time used is 0 ms 按W版编译:The Time used is 47 ms 可见,差别相当明显,请各位继续发表高见[/quote] 有这么奇怪的问题?照理说现在的系统都是原生态支持UNICODE的,不应该啊。 可以试下oyljerry的意见用insertstring替代addstring试试,若不行,直接弃用mfc的ccombobox用API测试下,这应该更权威。
davidyu720 2013-10-14
  • 打赏
  • 举报
回复
直接在dialog上拖了一个 combo box,用上面的代码测试 AddString() 10次 UNICODE/MBCS 都是 The Time used is 0 ms 改用for循环 添加100000次,去掉SORT属性,测试结果: UNIDODE: The Time used is 1547 ms The Time used is 1875 ms The Time used is 1891 ms The Time used is 1875 ms The Time used is 1922 ms The Time used is 1891 ms The Time used is 1890 ms MBCS : The Time used is 1797 ms The Time used is 2094 ms The Time used is 2281 ms The Time used is 2141 ms The Time used is 2219 ms The Time used is 2328 ms The Time used is 2031 ms
骑士传说 2013-10-14
  • 打赏
  • 举报
回复
注释在多一点啊 有点看不懂 新手
siasliu2008 2013-10-14
  • 打赏
  • 举报
回复
值得好好学习
oyljerry 2013-10-14
  • 打赏
  • 举报
回复
引用 26 楼 worldy 的回复:
[quote=引用 24 楼 clever101 的回复:] 不知道你是怎么测试的?有使用虚拟机吗?我建议在虚拟机测试,a版测试关闭虚拟机再重新启动虚拟机测试w版。
引用 19 楼 Reice91 的回复:
学习了呦好厉害
引用 17 楼 zcnvnv 的回复:
W版肯定是会更快的,绝大多数的A版API实际都是转换后调用W版 可能是你的某些其他代码导致 你用你这段代码要测试A/W版速度区别不科学
引用 11 楼 skyworth98 的回复:
建议用profiler查看各个函数的执行时间,应该就可以找到答案了
引用 2 楼 hdt 的回复:
莫非w传送的数据是a的两倍造成?
致各位朋友: 已经有点眉目了,问题出在idx=m_Account.AddString((TCHAR*)bs)上 另外建立个工程,运行以下代码 void CMyTestPrj2View::OnTestAddstring() { if (TxCombo.m_hWnd==0) { RECT r={10,50,300,300}; TxCombo.Create(WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,r,this,1000); } int t=GetTickCount(); TxCombo.ResetContent(); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); CString cs; cs.Format(_T("The Time used is %d ms\n"),GetTickCount()-t); TRACE(cs); } 按A版编译:The Time used is 0 ms 按W版编译:The Time used is 47 ms 可见,差别相当明显,请各位继续发表高见[/quote] http://stackoverflow.com/questions/229395/how-to-load-string-of-array-in-to-combobox-faster-in-mfc 是不是因为还有排序引起等
舉杯邀明月 2013-10-14
  • 打赏
  • 举报
回复
来学习一下。
worldy 2013-10-14
  • 打赏
  • 举报
回复
引用 24 楼 clever101 的回复:
不知道你是怎么测试的?有使用虚拟机吗?我建议在虚拟机测试,a版测试关闭虚拟机再重新启动虚拟机测试w版。
引用 19 楼 Reice91 的回复:
学习了呦好厉害
引用 17 楼 zcnvnv 的回复:
W版肯定是会更快的,绝大多数的A版API实际都是转换后调用W版 可能是你的某些其他代码导致 你用你这段代码要测试A/W版速度区别不科学
引用 11 楼 skyworth98 的回复:
建议用profiler查看各个函数的执行时间,应该就可以找到答案了
引用 2 楼 hdt 的回复:
莫非w传送的数据是a的两倍造成?
致各位朋友: 已经有点眉目了,问题出在idx=m_Account.AddString((TCHAR*)bs)上 另外建立个工程,运行以下代码 void CMyTestPrj2View::OnTestAddstring() { if (TxCombo.m_hWnd==0) { RECT r={10,50,300,300}; TxCombo.Create(WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,r,this,1000); } int t=GetTickCount(); TxCombo.ResetContent(); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); TxCombo.AddString(_T("How do u do?")); CString cs; cs.Format(_T("The Time used is %d ms\n"),GetTickCount()-t); TRACE(cs); } 按A版编译:The Time used is 0 ms 按W版编译:The Time used is 47 ms 可见,差别相当明显,请各位继续发表高见
1809913117 2013-10-14
  • 打赏
  • 举报
回复
这么深奥啊,,,这都是高手啊!!
clever101 2013-10-14
  • 打赏
  • 举报
回复
不知道你是怎么测试的?有使用虚拟机吗?我建议在虚拟机测试,a版测试关闭虚拟机再重新启动虚拟机测试w版。
加载更多回复(23)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧