分享
 
 
 

浮点数运算的性能,与整数相比

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

测试结果:

Test std::vector<int>(1000):

(+:234) (-:266) (*:281) (/:1687)

(+:219) (-:234) (*:282) (/:1656)

(+:234) (-:235) (*:265) (/:1625)

(+:235) (-:218) (*:297) (/:1594)

Test std::vector<long>(1000):

(+:219) (-:234) (*:313) (/:1625)

(+:218) (-:235) (*:265) (/:1704)

(+:218) (-:219) (*:297) (/:1594)

(+:234) (-:234) (*:282) (/:2109)

Test std::vector<float>(1000):

(+:250) (-:266) (*:265) (/:2328)

(+:266) (-:250) (*:250) (/:2281)

(+:282) (-:250) (*:250) (/:2609)

(+:250) (-:250) (*:250) (/:2781)

Test std::vector<double>(1000):

(+:422) (-:328) (*:344) (/:2422)

(+:344) (-:328) (*:578) (/:2422)

(+:360) (-:453) (*:359) (/:2422)

(+:297) (-:328) (*:313) (/:2312)

结论:

int,long,float,double的 +, -, * 运算性能是一样的,除法运算比较慢,占用时间较多,要尽量避免除法。

即:加,减,乘的运算时间与数据类型无关,所以可以随意使用更精确的float、double型,不影响程序速度。

以下是测试代码(请用Vc7生成一个console类型的空项目,将如下代码保存成文件加入项目,Release模式编译):

#include <iostream>

#include <vector>

#include <algorithm>

#include <functional>

#include <fstream>

#include <time.h>

#include <boost/bind.hpp> // for boost::bind

#include <boost/lambda/lambda.hpp> // for boost::lambda

#include <typeinfo.h>

template<typename T,typename TO>

void test(T &vec,TO &out)

{

out<< "Test std::vector<" << typeid(T::value_type).name() << ">(" << vec.size() << "):\t" ;

std::vector<T::value_type> myVecTest(4),myDst(vec.size());

std::generate( myVecTest.begin(),myVecTest.end(),boost::bind(std::divides<T::value_type>(),boost::bind(&rand),(T::value_type)9876) );

std::transform( myVecTest.begin(),myVecTest.end(),myVecTest.begin(),boost::bind(std::plus<T::value_type>(),3,_1) );

out<<"(";std::for_each( myVecTest.begin(),myVecTest.end(), out << boost::lambda::_1 << '\t' );out<<")";

out<<'\n';

for(int testIndex=0; testIndex<myVecTest.size(); ++testIndex)

{

clock_t dwStartTime = clock();

for(int nTimes = 0; nTimes < 100000; ++nTimes) // 计算的次数

for(int i=0,nSize=vec.size(); i<nSize; ++i) // 遍历数组

myDst[i] = vec[i] + myVecTest[testIndex];

out<< "(+:" << clock() - dwStartTime << ")\t"; // 输出时间

dwStartTime = clock();

for(int nTimes = 0; nTimes < 100000; ++nTimes) // 计算的次数

for(int i=0,nSize=vec.size(); i<nSize; ++i) // 遍历数组

myDst[i] = vec[i] - myVecTest[testIndex];

out<< "(-:" << clock() - dwStartTime << ")\t"; // 输出时间

dwStartTime = clock();

for(int nTimes = 0; nTimes < 100000; ++nTimes) // 计算的次数

for(int i=0,nSize=vec.size(); i<nSize; ++i) // 遍历数组

myDst[i] = vec[i] * myVecTest[testIndex];

out<< "(*:" << clock() - dwStartTime << ")\t"; // 输出时间

//dwStartTime = clock();

//for(int nTimes = 0; nTimes < 100000; ++nTimes) // 计算的次数

// for(int i=0,nSize=vec.size(); i<nSize; ++i) // 遍历数组

// myDst[i] = (long)vec[i] % (long)myVecTest[testIndex];

//out<< "(%:" << clock() - dwStartTime << ")\t"; // 输出时间

dwStartTime = clock();

for(int nTimes = 0; nTimes < 100000; ++nTimes) // 计算的次数

for(int i=0,nSize=vec.size(); i<nSize; ++i) // 遍历数组

myDst[i] = vec[i] / myVecTest[testIndex];

out<< "(/:" << clock() - dwStartTime << ")\n"; // 输出时间

}

out<<'\n';

std::transform( vec.begin(),vec.end(),myVecTest.begin(),vec.begin(),std::plus<T::value_type>() );

}

int main(int argc,char *argv[])

{

long lSize = 1000;

std::vector<int> myVecInt(lSize);

std::vector<long> myVecLong(lSize);

std::vector<float> myVecFloat(lSize);

std::vector<double> myVecDouble(lSize);

// 产生测试数据

std::generate( myVecInt.begin(), myVecInt.end(),rand );

std::generate( myVecLong.begin(), myVecLong.end(),rand );

std::generate( myVecFloat.begin(), myVecFloat.end(), boost::bind( std::divides<float>(),6789,boost::bind(&rand) ) );

std::transform( myVecFloat.begin(), myVecFloat.end(), myVecDouble.begin(), boost::bind( std::multiplies<double>(),3,_1) );

// 显示前n个数据

int n = 6;

std::for_each( myVecInt.begin(),myVecInt.begin()+n, std::cout << boost::lambda::_1 << '\t' );std::cout<<"\n\n";

std::for_each( myVecLong.begin(),myVecLong.begin()+n, std::cout << boost::lambda::_1 << '\t' );std::cout<<"\n\n";

std::for_each( myVecFloat.begin(),myVecFloat.begin()+n, std::cout << boost::lambda::_1 << '\t' );std::cout<<"\n\n";

std::for_each( myVecDouble.begin(),myVecDouble.begin()+n, std::cout << boost::lambda::_1 << '\t' );std::cout<<"\n\n";

std::ostream &of = std::cout; // 输出到屏幕

//std::ofstream of("C:\\testTime.txt",std::ios_base::out); // 输出到文件

test( myVecInt, of );

test( myVecLong, of );

test( myVecFloat, of );

test( myVecDouble, of );

//of.close(); // 关闭文件

// 显示前n个数据

std::for_each( myVecInt.begin(),myVecInt.begin()+n, std::cout << boost::lambda::_1 << '\t' );std::cout<<"\n\n";

std::for_each( myVecLong.begin(),myVecLong.begin()+n, std::cout << boost::lambda::_1 << '\t' );std::cout<<"\n\n";

std::for_each( myVecFloat.begin(),myVecFloat.begin()+n, std::cout << boost::lambda::_1 << '\t' );std::cout<<"\n\n";

std::for_each( myVecDouble.begin(),myVecDouble.begin()+n, std::cout << boost::lambda::_1 << '\t' );std::cout<<"\n\n";

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有