关于std::map性能测试

测试代码如下:


typedef struct Point
{
	double x;
	double y;
} 	Point;

typedef struct PointRect
{
	Point ptLeftTop;
	Point ptRightTop;
	Point ptLeftBottom;
	Point ptRightBottom;
} 	PointRect;

typedef struct VIDEO_PROPERTY
{
	float fAlpha;
	float fBrightness;
	float fContrast;
	float fSaturation;
	float fFeather;
	float fBlur;
	float fCircleCorner;
	float fLeftClip;
	float fRightClip;
	float fUpClip;
	float fDownClip;
} 	VIDEO_PROPERTY;

typedef struct AUDIO_PROPERTY
{
	int iVolume;
} 	AUDIO_PROPERTY;

typedef struct VIDEO_EFFECT
{
	VIDEO_PROPERTY prop;
	PointRect SrcRect;
	PointRect DstRect;
	int lWidth;
	int lHeight;
	BOOL bEnableVideoAlpha;
	BOOL bEnable16_235To0_255;
	BOOL bEnableVideoRatio;
	BOOL bEnableTransparent;
	float fVideoAspectRatio;
	UINT iVideoBackColor;
	BOOL bEnableMatte;
	UINT iMatteColor;
	float fMatteRange;
	BOOL bEnableCover;
	BOOL bCoverReverse;
	void *pCoverTexture;
	BOOL bEnableMap;
	void *pMapTexture;
	BOOL bEnableVertexMap;
	void *pMapVertexTexture;
	BOOL bHdrToSdr;
	BOOL bHorMirror;
	BOOL bVerMirror;
	BOOL bClipStretch;
	BOOL bFourSample;
} 	VIDEO_EFFECT;
typedef struct tagEffectParamInfo
{
	//std::string strName;  //特效变量名称
	std::string strType;  //特效变量类型
	//std::string strValue; //特效变量值
	std::any value; //特效变量值
}EffectParamInfo;

typedef struct tagSpecialEffect
{
	std::string effectName; //特效类型
	std::string techName;	//执行的特效
	//std::map<std::string, EffectParamInfo> effectParams; //特效变量
	std::map<int, EffectParamInfo> effectParams; //特效变量
}SpecialEffect;

std::string f2string(float f)
{
	if (f==1.0f)
		return "0.0";
	else if (f==0.0f)
		return "1.0";
	else
		return to_string(f);
}
bool VideoEffectToSpecialEffect(VIDEO_EFFECT *pVideoEffect, SpecialEffect *pSpecialEffect)
{
	if (!pVideoEffect || !pSpecialEffect)
		return false;

	EffectParamInfo info;
#if 1

	info.strType = "FLOAT"; info.value = pVideoEffect->prop.fAlpha;
	pSpecialEffect->effectParams[1] = info;
	info.strType = "FLOAT"; info.value = pVideoEffect->prop.fBrightness;
	pSpecialEffect->effectParams[2] = info;
	info.strType = "FLOAT"; info.value = pVideoEffect->prop.fContrast;
	pSpecialEffect->effectParams[3] = info;
	info.strType = "FLOAT"; info.value = pVideoEffect->prop.fSaturation;
	pSpecialEffect->effectParams[4] = info;
	info.strType = "FLOAT"; info.value = pVideoEffect->prop.fFeather;
	pSpecialEffect->effectParams[5] = info;
	info.strType = "FLOAT"; info.value = pVideoEffect->prop.fBlur;
	pSpecialEffect->effectParams[6] = info;
	info.strType = "FLOAT"; info.value = pVideoEffect->prop.fCircleCorner;
	pSpecialEffect->effectParams[7] = info;
	info.strType = "FLOAT"; info.value = pVideoEffect->prop.fLeftClip;
	pSpecialEffect->effectParams[8] = info;
	info.strType = "FLOAT"; info.value = pVideoEffect->prop.fRightClip;
	pSpecialEffect->effectParams[9] = info;
	info.strType = "FLOAT"; info.value = pVideoEffect->prop.fUpClip;
	pSpecialEffect->effectParams[10] = info;
	info.strType = "FLOAT"; info.value = pVideoEffect->prop.fDownClip;
	pSpecialEffect->effectParams[11] = info;
	info.strType = "INT"; info.value = pVideoEffect->lWidth;
	pSpecialEffect->effectParams[12] = info;
	info.strType = "INT"; info.value = pVideoEffect->lHeight;
	pSpecialEffect->effectParams[13] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bEnableVideoAlpha;
	pSpecialEffect->effectParams[14] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bEnable16_235To0_255;
	pSpecialEffect->effectParams[15] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bEnableVideoRatio;
	pSpecialEffect->effectParams[16] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bEnableTransparent;
	pSpecialEffect->effectParams[17] = info;
	info.strType = "FLOAT"; info.value = pVideoEffect->fVideoAspectRatio;
	pSpecialEffect->effectParams[18] = info;
	info.strType = "INT"; info.value = pVideoEffect->iVideoBackColor;
	pSpecialEffect->effectParams[19] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bEnableMatte;
	pSpecialEffect->effectParams[20] = info;
	info.strType = "INT"; info.value = pVideoEffect->iMatteColor;
	pSpecialEffect->effectParams[21] = info;
	info.strType = "FLOAT"; info.value = pVideoEffect->fMatteRange;
	pSpecialEffect->effectParams[22] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bEnableCover;
	pSpecialEffect->effectParams[23] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bCoverReverse;
	pSpecialEffect->effectParams[24] = info;
	info.strType = "ADDR"; info.value = pVideoEffect->pCoverTexture;
	pSpecialEffect->effectParams[25] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bEnableMap;
	pSpecialEffect->effectParams[26] = info;
	info.strType = "ADDR"; info.value = pVideoEffect->pMapTexture;
	pSpecialEffect->effectParams[27] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bEnableVertexMap;
	pSpecialEffect->effectParams[28] = info;
	info.strType = "ADDR"; info.value = pVideoEffect->pMapVertexTexture;
	pSpecialEffect->effectParams[29] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bHdrToSdr;
	pSpecialEffect->effectParams[30] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bHorMirror;
	pSpecialEffect->effectParams[31] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bVerMirror;
	pSpecialEffect->effectParams[32] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bClipStretch;
	pSpecialEffect->effectParams[33] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bFourSample;
	pSpecialEffect->effectParams[34] = info;

	/*info.strType = "FLOAT"; info.value = pVideoEffect->prop.fAlpha;
	pSpecialEffect->effectParams["fAlpha"] = info;
	info.strType = "FLOAT"; info.value = pVideoEffect->prop.fBrightness;
	pSpecialEffect->effectParams["fBrightness"] = info;
	info.strType = "FLOAT"; info.value = pVideoEffect->prop.fContrast;
	pSpecialEffect->effectParams["fContrast"] = info;
	info.strType = "FLOAT"; info.value = pVideoEffect->prop.fSaturation;
	pSpecialEffect->effectParams["fSaturation"] = info;
	info.strType = "FLOAT"; info.value = pVideoEffect->prop.fFeather;
	pSpecialEffect->effectParams["fFeather"] = info;
	info.strType = "FLOAT"; info.value = pVideoEffect->prop.fBlur;
	pSpecialEffect->effectParams["fBlur"] = info;
	info.strType = "FLOAT"; info.value = pVideoEffect->prop.fCircleCorner;
	pSpecialEffect->effectParams["fCircleCorner"] = info;
	info.strType = "FLOAT"; info.value = pVideoEffect->prop.fLeftClip;
	pSpecialEffect->effectParams["fLeftClip"] = info;
	info.strType = "FLOAT"; info.value = pVideoEffect->prop.fRightClip;
	pSpecialEffect->effectParams["fRightClip"] = info;
	info.strType = "FLOAT"; info.value = pVideoEffect->prop.fUpClip;
	pSpecialEffect->effectParams["fUpClip"] = info;
	info.strType = "FLOAT"; info.value = pVideoEffect->prop.fDownClip;
	pSpecialEffect->effectParams["fDownClip"] = info;
	info.strType = "INT"; info.value = pVideoEffect->lWidth;
	pSpecialEffect->effectParams["lWidth"] = info;
	info.strType = "INT"; info.value = pVideoEffect->lHeight;
	pSpecialEffect->effectParams["lHeight"] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bEnableVideoAlpha ;
	pSpecialEffect->effectParams["bEnableVideoAlpha"] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bEnable16_235To0_255 ;
	pSpecialEffect->effectParams["bEnable16_235To0_255"] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bEnableVideoRatio ;
	pSpecialEffect->effectParams["bEnableVideoRatio"] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bEnableTransparent;
	pSpecialEffect->effectParams["bEnableTransparent"] = info;
	info.strType = "FLOAT"; info.value = pVideoEffect->fVideoAspectRatio;
	pSpecialEffect->effectParams["fVideoAspectRatio"] = info;
	info.strType = "INT"; info.value = pVideoEffect->iVideoBackColor;
	pSpecialEffect->effectParams["iVideoBackColor"] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bEnableMatte;
	pSpecialEffect->effectParams["bEnableMatte"] = info;
	info.strType = "INT"; info.value = pVideoEffect->iMatteColor;
	pSpecialEffect->effectParams["iMatteColor"] = info;
	info.strType = "FLOAT"; info.value = pVideoEffect->fMatteRange;
	pSpecialEffect->effectParams["fMatteRange"] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bEnableCover;
	pSpecialEffect->effectParams["bEnableCover"] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bCoverReverse;
	pSpecialEffect->effectParams["bCoverReverse"] = info;
	info.strType = "ADDR"; info.value = pVideoEffect->pCoverTexture;
	pSpecialEffect->effectParams["pCoverTexture"] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bEnableMap;
	pSpecialEffect->effectParams["bEnableMap"] = info;
	info.strType = "ADDR"; info.value = pVideoEffect->pMapTexture;
	pSpecialEffect->effectParams["pMapTexture"] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bEnableVertexMap;
	pSpecialEffect->effectParams["bEnableVertexMap"] = info;
	info.strType = "ADDR"; info.value = pVideoEffect->pMapVertexTexture;
	pSpecialEffect->effectParams["pMapVertexTexture"] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bHdrToSdr;
	pSpecialEffect->effectParams["bHdrToSdr"] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bHorMirror;
	pSpecialEffect->effectParams["bHorMirror"] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bVerMirror;
	pSpecialEffect->effectParams["bVerMirror"] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bClipStretch;
	pSpecialEffect->effectParams["bClipStretch"] = info;
	info.strType = "BOOL"; info.value = pVideoEffect->bFourSample;
	pSpecialEffect->effectParams["bFourSample"] = info;*/
#else
	info.strType = "FLOAT"; info.strValue = f2string(pVideoEffect->prop.fAlpha);
	pSpecialEffect->effectParams["fAlpha"] = info;
	info.strType = "FLOAT"; info.strValue = f2string(pVideoEffect->prop.fBrightness);
	pSpecialEffect->effectParams["fBrightness"] = info;
	info.strType = "FLOAT"; info.strValue = f2string(pVideoEffect->prop.fContrast);
	pSpecialEffect->effectParams["fContrast"] = info;
	info.strType = "FLOAT"; info.strValue = f2string(pVideoEffect->prop.fSaturation);
	pSpecialEffect->effectParams["fSaturation"] = info;
	info.strType = "FLOAT"; info.strValue = f2string(pVideoEffect->prop.fFeather);
	pSpecialEffect->effectParams["fFeather"] = info;
	info.strType = "FLOAT"; info.strValue = f2string(pVideoEffect->prop.fBlur);
	pSpecialEffect->effectParams["fBlur"] = info;
	info.strType = "FLOAT"; info.strValue = f2string(pVideoEffect->prop.fCircleCorner);
	pSpecialEffect->effectParams["fCircleCorner"] = info;
	info.strType = "FLOAT"; info.strValue = f2string(pVideoEffect->prop.fLeftClip);
	pSpecialEffect->effectParams["fLeftClip"] = info;
	info.strType = "FLOAT"; info.strValue = f2string(pVideoEffect->prop.fRightClip);
	pSpecialEffect->effectParams["fRightClip"] = info;
	info.strType = "FLOAT"; info.strValue = f2string(pVideoEffect->prop.fUpClip);
	pSpecialEffect->effectParams["fUpClip"] = info;
	info.strType = "FLOAT"; info.strValue = f2string(pVideoEffect->prop.fDownClip);
	pSpecialEffect->effectParams["fDownClip"] = info;
	info.strType = "INT"; info.strValue = f2string(pVideoEffect->lWidth);
	pSpecialEffect->effectParams["lWidth"] = info;
	info.strType = "INT"; info.strValue = f2string(pVideoEffect->lHeight);
	pSpecialEffect->effectParams["lHeight"] = info;
	info.strType = "BOOL"; info.strValue = pVideoEffect->bEnableVideoAlpha ? "TRUE" : "FALSE";
	pSpecialEffect->effectParams["bEnableVideoAlpha"] = info;
	info.strType = "BOOL"; info.strValue = pVideoEffect->bEnable16_235To0_255 ? "TRUE" : "FALSE";
	pSpecialEffect->effectParams["bEnable16_235To0_255"] = info;
	info.strType = "BOOL"; info.strValue = pVideoEffect->bEnableVideoRatio ? "TRUE" : "FALSE";
	pSpecialEffect->effectParams["bEnableVideoRatio"] = info;
	info.strType = "BOOL"; info.strValue = pVideoEffect->bEnableTransparent ? "TRUE" : "FALSE";
	pSpecialEffect->effectParams["bEnableTransparent"] = info;
	info.strType = "FLOAT"; info.strValue = f2string(pVideoEffect->fVideoAspectRatio);
	pSpecialEffect->effectParams["fVideoAspectRatio"] = info;
	info.strType = "INT"; info.strValue = f2string(pVideoEffect->iVideoBackColor);
	pSpecialEffect->effectParams["iVideoBackColor"] = info;
	info.strType = "BOOL"; info.strValue = pVideoEffect->bEnableMatte ? "TRUE" : "FALSE";
	pSpecialEffect->effectParams["bEnableMatte"] = info;
	info.strType = "INT"; info.strValue = f2string(pVideoEffect->iMatteColor);
	pSpecialEffect->effectParams["iMatteColor"] = info;
	info.strType = "FLOAT"; info.strValue = f2string(pVideoEffect->fMatteRange);
	pSpecialEffect->effectParams["fMatteRange"] = info;
	info.strType = "BOOL"; info.strValue = pVideoEffect->bEnableCover ? "TRUE" : "FALSE";
	pSpecialEffect->effectParams["bEnableCover"] = info;
	info.strType = "BOOL"; info.strValue = pVideoEffect->bCoverReverse ? "TRUE" : "FALSE";
	pSpecialEffect->effectParams["bCoverReverse"] = info;
	info.strType = "ADDR"; info.strValue = f2string((__int64)pVideoEffect->pCoverTexture);
	pSpecialEffect->effectParams["pCoverTexture"] = info;
	info.strType = "BOOL"; info.strValue = pVideoEffect->bEnableMap ? "TRUE" : "FALSE";
	pSpecialEffect->effectParams["bEnableMap"] = info;
	info.strType = "ADDR"; info.strValue = f2string((__int64)pVideoEffect->pMapTexture);
	pSpecialEffect->effectParams["pMapTexture"] = info;
	info.strType = "BOOL"; info.strValue = pVideoEffect->bEnableVertexMap ? "TRUE" : "FALSE";
	pSpecialEffect->effectParams["bEnableVertexMap"] = info;
	info.strType = "ADDR"; info.strValue = f2string((__int64)pVideoEffect->pMapVertexTexture);
	pSpecialEffect->effectParams["pMapVertexTexture"] = info;
	info.strType = "BOOL"; info.strValue = pVideoEffect->bHdrToSdr ? "TRUE" : "FALSE";
	pSpecialEffect->effectParams["bHdrToSdr"] = info;
	info.strType = "BOOL"; info.strValue = pVideoEffect->bHorMirror ? "TRUE" : "FALSE";
	pSpecialEffect->effectParams["bHorMirror"] = info;
	info.strType = "BOOL"; info.strValue = pVideoEffect->bVerMirror ? "TRUE" : "FALSE";
	pSpecialEffect->effectParams["bVerMirror"] = info;
	info.strType = "BOOL"; info.strValue = pVideoEffect->bClipStretch ? "TRUE" : "FALSE";
	pSpecialEffect->effectParams["bClipStretch"] = info;
	info.strType = "BOOL"; info.strValue = pVideoEffect->bFourSample ? "TRUE" : "FALSE";
	pSpecialEffect->effectParams["bFourSample"] = info;
#endif
	return true;
}

UINT GetBooLSpecialEffect(SpecialEffect *pSpecialEffect)
{
	auto it = pSpecialEffect->effectParams.find(21);
	if(it != pSpecialEffect->effectParams.end())
	{
		if (it->second.strType == "INT")
		{
			return std::any_cast<UINT>(it->second.value);
		}
	}
}


int main(int argc, char* argv[])
{
	SpecialEffect specialEffect;
	specialEffect.effectName = "main";
	specialEffect.techName = "auto";
	VIDEO_EFFECT effect = { 0 };
	effect.prop.fAlpha = 1.0f;
	effect.iMatteColor = 1;
	int time1 = timeGetTime();
	for (int i = 0; i < 10000; i++)
	{
		VideoEffectToSpecialEffect(&effect, &specialEffect);
	}
	int time2 = timeGetTime();

	UINT t = 0;
	for (int i = 0; i < 10000; i++)
	{
		t += GetBooLSpecialEffect(&specialEffect);
	
	int time3 = timeGetTime();
	printf("t:%d\n", t);
	printf("\n 总时间:%d %d %d", time3 - time1,time2-time1,time3-time2);
	scanf_s("");
	return 0;
}

测试结果:

前提条件:执行10000次函数调用。

1.map主要的性能消耗是在构造map的时候,查找map 基本不耗性能。

2.如果map的key用string类型,执行10000次VideoEffectToSpecialEffect函数,但是每次只是修改specialEffect的值,耗时45ms左右。

3.如果map的key用string类型,执行10000次VideoEffectToSpecialEffect函数,但是每次只是都创建specialEffect变量,耗时110ms左右.

4.由2和3得出结论,执行10000次创建specialEffect变量,将耗时60多ms.

5.如果将map的key改为int类型。执行10000次VideoEffectToSpecialEffect函数,但是每次只是修改specialEffect的值,耗时15ms左右.

6.如果将map的key改为int类型,执行10000次VideoEffectToSpecialEffect函数,但是每次只是都创建specialEffect变量,耗时75ms左右.

7.由5和6得出结论,执行10000次创建specialEffect变量,将耗时60多ms. 将key改为int,执行10000次将节省30ms.

8.将VideoEffectToSpecialEffect函数字符串转换改成std::any类型将节省15毫秒。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值