测试时经验总结:
1.数组长度超过1百万,不能存储在栈上,容易内存溢出。存为全局变量,存在堆上;
内存分为栈内存,堆内存,全局区,常量区,代码区。
栈内存存储的都是局部变量。由操作系统管理,程序一旦离开作用域,就会释放变量。栈的大小有限制,常见的是1M或2M大小,因此非常容易超出;
堆内存存储的是对象,凡是new建立的都在堆中,堆内的数据由用户释放。堆的大小基本无限制,但得注意释放内存。
全局区存储的是全局变量和静态变量。
2.内存直接操作,是比赋值快的,使用循环的方式赋值,速度显著的慢;
函数有memcpy(),memmove(),memset()
void *memcpy(void *dst,void const *src,size_t length)
void *memmove(void *dst,void const *src,size_t length),效率慢于memcpy,但可以处理拷贝的两端内存重叠的问题。
void *memset(void *a,int ch,size_t length),把从a开始的length个字节设置成字符值ch,可以初始化字符数组。
结果显示,操作内存也没快多少,快了1ms左右。
1.数组快速初始化方法
各种初始化为零的性能对比:
2.字符数组存储字符串
3.计算代码运行时间
方法1:包含头文件(不准确,容易出错)
#include <time.h>
#include <Windows.h>
//计时开始
clock_t start;
start = clock();
//计时结束
cout<<clock()-start<<" ms"<<endl;
方法2:自定义计时类
头文件:
//MyTimer.h//
#ifndef __MyTimer_H__
#define __MyTimer_H__
#include <windows.h>
class MyTimer
{
private:
int _freq;
LARGE_INTEGER _begin;
LARGE_INTEGER _end;
public:
long costTime; // 花费的时间(精确到微秒)
public:
MyTimer()
{
LARGE_INTEGER tmp;
QueryPerformanceFrequency(&tmp);//QueryPerformanceFrequency()作用:返回硬件支持的高精度计数器的频率。
_freq = tmp.QuadPart;
costTime = 0;
}
void Start() // 开始计时
{
QueryPerformanceCounter(&_begin);//获得初始值
}
void End() // 结束计时
{
QueryPerformanceCounter(&_end);//获得终止值
costTime = (long)((_end.QuadPart - _begin.QuadPart) * 1000000 / _freq);
}
void Reset() // 计时清0
{
costTime = 0;
}
};
#endif
使用方法:
MyTimer timer;
timer.Start();
Sleep(1000);
timer.End();
cout << "耗时为:" << timer.costTime << "us";
留言与评论(共有 0 条评论) |