问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Linux求数组长度为10000的浮点数(精确小数点右4位)计算值

发布网友 发布时间:2022-04-27 09:20

我来回答

1个回答

热心网友 时间:2023-10-03 05:55

既然题主没有说要求用什么语言,那我就用c++11实现了。

#include <iostream>

#include <random>

#include <thread>

#include <chrono>

#include <algorithm>

#include <iomanip>


using namespace std;


const int size = 10000;

float table[size];


int main(){

random_device engine;

uniform_real_distribution<float> dist(0, 1);

float sum;


for(auto& i: table){

i = dist(engine);

}


auto t_start = chrono::system_clock::now();

sum = accumulate(table, table + size, 0.0);

auto t_end = chrono::system_clock::now();

auto ration = std::chrono::ration_cast<std::chrono::microseconds>(t_end - t_start).count();

cout << "sum of the main thread: " << fixed << setprecision(4) << sum << endl;

cout << "time elapsed: " << ration << " micro seconds" << endl;


float sum_child[4];

auto fun = [&](int index){

sum_child[index] = accumulate(table + index * size / 4, table + (index + 1) * size / 4, 0.0);

};


t_start = chrono::system_clock::now();

thread thrd_table[4] = {

thread(fun, 0), thread(fun, 1), thread(fun, 2), thread(fun, 3)

};

for(auto& thrd: thrd_table){

thrd.join();

}

sum = 0;

sum = accumulate(sum_child, sum_child + 4, 0.0);

t_end = chrono::system_clock::now();

ration = std::chrono::ration_cast<std::chrono::microseconds>(t_end - t_start).count();

cout << "sum of child threads: " << fixed << setprecision(4) << sum << endl;

cout << "time elapsed: " << ration << " micro seconds" << endl;


return 0;

}


编译:

g++ -std=c++11 test.cc -lpthread -o test

运行:

./test

结果:

sum of the main thread: 4976.8721

time elapsed: 0 ms

sum of child threads: 4976.8721

time elapsed: 0 ms


由于随机性每次加和的数值不同,但是精确到毫秒时,时间测出来妥妥的都是零。就是数据量太小,实际运行时间在微秒量级,当然看不出来。

精度改为微秒以后:

sum of the main thread: 4957.9878

time elapsed: 113 micro seconds

sum of child threads: 4957.9878

time elapsed: 560 micro seconds

多线程反而比单线程慢,因为启动线程本身也需要时间。

数据量再增大1000倍:

sum of the main thread: 4999892.0000

time elapsed: 25313 micro seconds

sum of child threads: 4999892.0000

time elapsed: 8986 micro seconds

这回看着正常多了吧

热心网友 时间:2023-10-03 05:55

既然题主没有说要求用什么语言,那我就用c++11实现了。

#include <iostream>

#include <random>

#include <thread>

#include <chrono>

#include <algorithm>

#include <iomanip>


using namespace std;


const int size = 10000;

float table[size];


int main(){

random_device engine;

uniform_real_distribution<float> dist(0, 1);

float sum;


for(auto& i: table){

i = dist(engine);

}


auto t_start = chrono::system_clock::now();

sum = accumulate(table, table + size, 0.0);

auto t_end = chrono::system_clock::now();

auto ration = std::chrono::ration_cast<std::chrono::microseconds>(t_end - t_start).count();

cout << "sum of the main thread: " << fixed << setprecision(4) << sum << endl;

cout << "time elapsed: " << ration << " micro seconds" << endl;


float sum_child[4];

auto fun = [&](int index){

sum_child[index] = accumulate(table + index * size / 4, table + (index + 1) * size / 4, 0.0);

};


t_start = chrono::system_clock::now();

thread thrd_table[4] = {

thread(fun, 0), thread(fun, 1), thread(fun, 2), thread(fun, 3)

};

for(auto& thrd: thrd_table){

thrd.join();

}

sum = 0;

sum = accumulate(sum_child, sum_child + 4, 0.0);

t_end = chrono::system_clock::now();

ration = std::chrono::ration_cast<std::chrono::microseconds>(t_end - t_start).count();

cout << "sum of child threads: " << fixed << setprecision(4) << sum << endl;

cout << "time elapsed: " << ration << " micro seconds" << endl;


return 0;

}


编译:

g++ -std=c++11 test.cc -lpthread -o test

运行:

./test

结果:

sum of the main thread: 4976.8721

time elapsed: 0 ms

sum of child threads: 4976.8721

time elapsed: 0 ms


由于随机性每次加和的数值不同,但是精确到毫秒时,时间测出来妥妥的都是零。就是数据量太小,实际运行时间在微秒量级,当然看不出来。

精度改为微秒以后:

sum of the main thread: 4957.9878

time elapsed: 113 micro seconds

sum of child threads: 4957.9878

time elapsed: 560 micro seconds

多线程反而比单线程慢,因为启动线程本身也需要时间。

数据量再增大1000倍:

sum of the main thread: 4999892.0000

time elapsed: 25313 micro seconds

sum of child threads: 4999892.0000

time elapsed: 8986 micro seconds

这回看着正常多了吧

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? C语言中:如果变量x的范围超出long int。用浮点法怎么用 怎么查公务员职位表里的是不是要求全日制的 C语言中,为什么要进行什么“双精度浮点”之类的定义?有什么用? xml里面 resulttype=&quot;int&quot;是接收int类型的数据,那接收浮点类型的数据用什么类型?求大佬解答 是否全日制是神马意思? 关于浮点数除法的计算 菜鸟提问,关于C的数据类型 为何使用PLC编程有些数据处理需要转化成浮点数,浮点数是做什么的?与整数存在什么关系那? 能够确认是否是普通全日制还是非普通全日制吗 float的取值范围怎么计算 怎么看学历是不是全日制 C语言问题。一个int型与一个long型数据运算,先将int型转换成long型,啥... 怎么能知道自己的学历是不是全日制 ...处理int,long,double,float类型的数据,若为浮点型只输出整数部分的位... 我怎样才能知道我的本科是不是全日制? 农村宅基地只有土地使用权能建房吗 不建住房? 怎么区别毕业证是不是全日制的? 农村宅基地为什么不能盖房子了呢? java开发中,一般涉及到金钱计算的时候用什么数据类型 为什么现在农村不能盖房子了? 线雕可以去眼袋吗 央视“最美女主播胡蝶”是美丽的女郎,但够的上丰满女郎吗? 韩国线雕去眼袋的效果如何? 美女主播胡蝶和歌星汤灿谁丰满 线雕去眼袋的效果怎样 眼袋松弛成都去做线雕哪儿技术可靠? 央视美女主播胡蝶和台湾歌星蔡依林谁丰满? 线雕能去眼袋吗 线雕去眼袋的效果你别被忽悠 线雕眼袋是永久的吗 请问这个主播叫啥名??? 线雕眼袋有危害吗 求这个女主播的快手号 成都眼袋松弛可以做线雕吗?哪里可以做? 现在的娱乐圈鱼龙混杂,大家觉得最性感的女主持人是谁? 线雕面部埋的出现眼袋怎么办皮肤太松面部线雕做完眼袋鼓出来了 曾因胸围惹争议,现在却成电话大王儿媳妇的央视主持,是谁? 线雕去眼袋怎么样 一米九的“女主播”商场吸睛,斜挎包包,斜挎包如何穿出高级感? 眼部线雕有何副作用?做完线雕几天能消肿 做完线雕以后眼睛鼓出眼袋是怎么回事?