当前位置:网站首页>C语言必杀技3行代码把运行速度提升4倍
C语言必杀技3行代码把运行速度提升4倍
2022-08-01 21:26:00 【cpp编程】
需求场景
变态BOSS对奇牛程序员的苛刻要求:
把新研发的医疗设备,计算速度再提高两倍!

BOSS: “不计研发成本,必须把计算速度提高2倍以上!我们要有碾压优势!”

原问题抽象示例:
#include <stdio.h>
#include <Windows.h>
int main(void) {
// 返回操作系统启动后到现在的毫秒数
DWORD start_time = GetTickCount();
double sum = 0;
for (int i = 0; i <= 100000000; i++) { //计算1亿次
sum += i;
}
DWORD end_time = GetTickCount();
printf("%ld\n", end_time - start_time);
printf("%f\n", sum);
return 0;
}测试发现,需要296ms。

启用OpenMP

优化后的代码:
#include <stdio.h>
#include <Windows.h>
#include <omp.h>
int main(void) {
// 设置线程数,一般设置的线程数不超过CPU核心数,这里开4个线程执行并行代码段
omp_set_num_threads(4);
// 返回操作系统启动后到现在的毫秒数
DWORD start_time = GetTickCount();
double sum = 0;
#pragma omp parallel
{
#pragma omp for reduction (+:sum)
for (int i = 0; i <= 100000000; i++) {
sum += i;
}
}
DWORD end_time = GetTickCount();
printf("%ld\n", end_time - start_time);
printf("%f\n", sum);
return 0;
}
速度提升近5倍!
程序员的维度空间
- 程序员的零维空间
小白,鸿蒙初始。
- 程序员的一维空间
单线程模型。
从main函数开始,一路跑到底。
- 程序员的二维空间
多线程,实现第一次飞跃。
比如:QQ
一边视频聊天
一边收发文件
一边文字聊天
程序中,同时执行多个函数!!!
520 浪漫烟花:不完美的: 有点卡 因为是单线程实现
多线程方案:
- Win32多线程
- linux多线程
- C++新特性的多线程
Win32多线程Demo
#include <stdio.h>
#include<windows.h>
#include "omp.h"
struct data {
int min;
int max;
};
DWORD WINAPI ThreadFuncFirst(LPVOID param)
{
data* arg = (data*)param;
DWORD ret = 0;
for (int i = arg->min; i <= arg->max; i++) {
ret += i;
}
return ret;
}
int main(void) {
struct data data1 = { 1,50 };
struct data data2 = { 51,100 };
DWORD dwThreadID = 0;
HANDLE handleFirst = CreateThread(NULL, 0, ThreadFuncFirst, LPVOID(&data1), 0, &dwThreadID);
HANDLE handleSecond = CreateThread(NULL, 0, ThreadFuncFirst, LPVOID(&data2), 0, &dwThreadID);
WaitForSingleObject(handleFirst, INFINITE);//等待线程返回
WaitForSingleObject(handleSecond, INFINITE);
DWORD exitCode1 = 0; //用来保存线程结束时的返回值
DWORD exitCode2 = 0;
GetExitCodeThread(handleFirst, &exitCode1);
GetExitCodeThread(handleSecond, &exitCode2);
CloseHandle(handleFirst); // 线程函数执行完后释放资源(销毁线程)
CloseHandle(handleSecond);
printf("%d\n", exitCode1);
printf("%d\n", exitCode2);
printf("%d\n", exitCode1 + exitCode2);
return 0;
}- 程序员的三维空间
程序员的三维空间-线程池。
为什么要使用线程池
WEB服务器、数据库服务器的核心问题:
单位时间内,有海量请求!
传统方案的线程执行过程分为三个过程:
T1:线程创建时间
T2:线程执行时间
T3:线程销毁时间
传统的多线程模型,难以解决:
- 频繁的创建线程、销毁线程,导致CPU效率不高
- 同时创建太多线程,导致系统反而变慢,甚至崩溃
线程池原理剖析

程序启动后,立即创建一定数量的线程(N1),放入空闲队列。
这些线程都是处于阻塞(Suspended)状态,不消耗CPU,占用较小的内存空间。
当任务到来后,从空闲队列中选择一个空闲线程,把任务传入此线程中运行。
在任务执行完后,线程不销毁,继续在队列中等待任务。
当N1个线程都在处理任务后,缓冲池自动创建一定数量的新线程,作为备用。
当系统比较空闲时,线程池自动销毁一部分线程,回收系统资源。
关键问题:多线程的同步技术,线程池的框架实现。
边栏推荐
- Spark练习题+答案
- JS Improvement: Handwritten Publish Subscriber Model (Xiaobai)
- Interview Blitz 70: What are sticky packs and half packs?How to deal with it?
- [Chinese tree tags - CTB]
- ISC2022 HackingClub白帽峰会倒计时1天!最全议程正式公布!元宇宙集结,精彩绝伦!
- 基于php动漫周边商城管理系统(php毕业设计)
- HCIP---企业网的架构
- 基于php在线音乐网站管理系统获取(php毕业设计)
- Based on php online examination management system acquisition (php graduation design)
- Flink集群搭建
猜你喜欢
随机推荐
C Pitfalls and Defects Chapter 7 Portability Defects 7.8 Size of Random Numbers
WEB 渗透之端口协议
JVM内存结构详解
How to choose Visibility, Display, and Opacity when interacting or animating
”sed“ shell脚本三剑客
Shell编程条件语句
Classification interface, Taobao classification details API
C Expert Programming Chapter 1 C: Through the Fog of Time and Space 1.3 The Standard I/O Library and the C Preprocessor
磷酸化甘露糖苷修饰白蛋白纳米粒/卵白蛋白-葡聚糖纳米凝胶的
如何优雅的性能调优,分享一线大佬性能调优的心路历程
Interview Blitz 70: What are sticky packs and half packs?How to deal with it?
对C语言结构体内存对齐的理解
The difference between groupByKey and reduceBykey
方舟生存进化是什么游戏?好不好玩
小程序--独立分包&分包预下载
【Unity实战100例】文件压缩Zip和ZIP文件的解压
基于php湘西旅游网站管理系统获取(php毕业设计)
C语言_枚举类型介绍
An online JVM FullGC made it impossible to sleep all night and completely crashed~
一个关于操作数据库的建议—用户密码









