CString的效率测试

(35) 2023-10-16 15:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说CString的效率测试,希望能够帮助你!!!。

#VC205# #MFC#

有时候我们使用CString,不为别的,只是一个简单的格式化一个数字,但是CString的内部是需要申请内存的(堆),虽然说作用域过去了,就自动释放。但频繁的申请与释放,对系统来讲,也是需要时间去处理它的。所以我就想,使用局部变量(栈)来实现。

定义了一个struct 里面有一个变量 pv ,它是一个数组,而不是指针

struct jStrBuf##N{

TCHAR pv[N];

}

JSTRBUF(1024) 表示定义一个

struct jStrBuf1024 {

TCHAR pv[1024];

}

为了方便使用,我给它定义了一个长度Len,这个Len,初始时是数组的长度,一但调用过Format后,结果就是实际的字符串长度

#pragma  once
#define JSTRBUF(N)\
struct jStrBuf##N {\
	TCHAR pv[N];int Len = N;\
	operator LPCTSTR(){return pv;}\
	jStrBuf##N(){pv[0]=0;}\
	jStrBuf##N & operator =(LPCTSTR v){Len=lstrlen(lstrcpy(pv,v));return *this;}\
	TCHAR operator[](int i){return i<0?pv[Len+i]:pv[i];}\
	TCHAR * D(int v){return Format(_T("%d"),v);}\
	TCHAR * X(unsigned char v){return Format(_T("%02X"),v);}\
	TCHAR * Format(LPCWSTR fm, ...) { return Len=_vstprintf_p(pv,N, fm,(char*)(&fm+1)),pv; }};
JSTRBUF(4096);

#ifdef _DEBUG

void JSTRBUF_test(int N) {
	int tick;
	SYSTEMTIME st; GetLocalTime(&st);
	wprintf(_T("jStrBuf Vs CString [N=%dw]\n")
		_T(" Time:%04d-%02d-%02d %02d:%02d:%02d\n\n"),
		N/10000,
		st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);

	tick = GetTickCount();
	CString cstr;
	for (int i = N; i >= 0; i--) {
		GetModuleFileName(0, cstr.GetBuffer(256), 256);
		cstr.Format(_T("%s %f"), cstr, 20230510.0);
		if (i == 0) wprintf(_T("CString\n N=%d\n Value=%s\n tick=%d\r\n"),
			N, (LPCTSTR)cstr, GetTickCount() - tick);
	}

	tick = GetTickCount();
	jStrBuf4096 jstr;
	for (int i = N; i >= 0;i--) {
		GetModuleFileName(0, jstr.pv, jstr.Len);
		jstr.Format(_T("%s %f"), jstr.pv, 20230510.0);
		if (i == 0) wprintf(_T("jStrBuf\n N=%d\n Value=%s\n tick=%d\r\n"),
			N, (LPCTSTR)jstr, GetTickCount() - tick);
		
	}

	tick = GetTickCount();

	for (int i = N; i >= 0; i--) {
		TCHAR buf[MAX_PATH];
		GetModuleFileName(0, buf, MAX_PATH);
		_stprintf_p(buf,N,_T("%s %f"),buf, 20230510.0);
		if (i == 0) wprintf(_T("wsprintf.buf\n N=%d\n Value=%s\n tick=%d\r\n"),
			N, (LPCTSTR)jstr, GetTickCount() - tick);
	}
}

#endif

测试结果如下,分别是10万,50万,100万次的测试结果,CString 消耗的时间都是1倍

CString的效率测试_https://bianchenghao6.com/blog__第1张

CString的效率测试_https://bianchenghao6.com/blog__第2张

CString的效率测试_https://bianchenghao6.com/blog__第3张

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复