cout输出数组_让程序从1开始一直执行++操作,10秒钟能输出最大的数是多少

问题描述

如果写一段代码,让程序从 1 开始一直执行 ++ 操作,在规定的 10s 钟内,你能输出的最大数是多少?并将它打印到屏幕上。

乍一看,你会觉得它是一道算法题,再细想:不对!这可能是一道性能题。

题目拆解

首先,定义一个变量 i,并赋值为 1, 接着进入 while 循环,执行 i++. 需要注意的是,这个变量可能非常大,超出了类型的最大值,那么就需要用一个数组来存储这个变量,数组中的每个元素分别表示这个数的每一位。

其次,单线程处理时,每次进入 while 循环时,都需要获取程序运行时间,当程序运行时间快到 10s 时得赶紧退出循环,并将这个“大数”打印到屏幕上。否则,如果没来得及输出到屏幕,就前功尽弃了。

进阶

看起来,上述思路已经足以解决这个问题了。然而,这也许并不是最优解。这里,我们采用多线程机制试试。具体步骤如下:

  • 在主线程里开辟两个新进程 A 和 B;
  • 在线程 A 里执行 ++ 操作;
  • 在线程 B 里实时获取程序运行时间;
  • 在线程 A 里判断是否运行超时,并及时退出并输出结果。

测试结果

  1. 硬件信息

如图所示,intel 处理器 i5,4核。

b754321c259f2c9621b02c757048b469.png

硬件信息

  1. 性能数据
2373bb6393407a20f8bed4b19022041d.png

测试结果

单线程时:10s 时间内 C++ 程序能够输出的最大值为 4819531;

多线程时:10s 时间内 C++ 程序能够输出的最大值为 19726951;

多线程性能是单线程性能的 4 倍!

原因分析

很可能是因为多核,不同线程跑在不同的核上,充分利用 CPU。

软件性能是每个程序员都要面临的问题,从基本的代码级性能优化,到数据 cache miss、指令 cache miss 优化,再到多线程协同、绑核、资源调度算法,甚至对二进制目标文件的内容进行重排。。。等等,所涉及的面非常广,也可以非常深。

附录:C++ 代码,供参考

main.cpp

#include "Global.h"#include "ProcessInfo.h"#include "Test.h"#include #include #include namespace Single {void SinglePrint(std::vector& val){    std::cout << "testVal is: ";    unsigned int i = 0;    for (; i < val.size(); i++) {        if (val[i] != 0) {            break;        }    }    for (unsigned int j = i; j < val.size(); j++) {        std::cout << val[j];    }    std::cout << std::endl;}void SingleTestAdd(){    std::vector testVal(Global::bitNum, 0);    while (true) {        int flag = 0;        int tmp;        for (int i = Global::bitNum - 1; i >= 0; i--) {            if (i == Global::bitNum - 1) {                tmp = testVal[i] + 1 + flag;            } else {                tmp = testVal[i] + flag;            }            if (tmp >= 10) {                flag = 1;            } else {                flag = 0;            }            testVal[i] = (tmp % 10);        }        clock_t t = clock();        ProcessInfo::currTime = (double)t / CLOCKS_PER_SEC;        if ((ProcessInfo::currTime - ProcessInfo::startTime) > Global::expireTime) {            std::cout << "currTime: " << ProcessInfo::currTime << std::endl;            SinglePrint(testVal);            break;        }    }    return;};}int main(){    std::cout << "test multi thread performance : " << std::endl;    ProcessInfo::GetProcessStartTime();    std::cout << "startTime: " << ProcessInfo::startTime << std::endl;    std::thread t1(ProcessInfo::GetProcessCurrTime);    std::thread t2(Test::TestAdd);    t1.detach();    t2.join();        std::cout << "test single thread performance : " << std::endl;    ProcessInfo::GetProcessStartTime();    std::cout << "startTime: " << ProcessInfo::startTime << std::endl;    Single::SingleTestAdd();    return 0;}

Global.h - 单例类,定义全局变量:

#ifndef _GLOBAL_H_#define _GLOBAL_H_#include class Global {private:    Global(){};    static Global* global;public:    static Global* GetGlobalInstance() {        if (global == NULL) {            global = new Global();        }        return global;    }public:    static int bitNum;    static int expireTime;};#endif

Global.cpp

#include "Global.h"int Global::bitNum = 64;int Global::expireTime = 10;

ProcessInfo.h - 程序运行信息类

#ifndef _PROCESSINFO_H_#define _PROCESSINFO_H_#include class ProcessInfo{public:    ProcessInfo(){};    static double startTime;    static double currTime;    static void GetProcessStartTime()    {        clock_t tmp = clock();        startTime = (double)tmp / CLOCKS_PER_SEC;    };    static void GetProcessCurrTime()    {        while(1) {            clock_t tmp = clock();            currTime = (double)tmp / CLOCKS_PER_SEC;        }    };};#endif

ProcessInfo.cpp

#include "ProcessInfo.h"double ProcessInfo::startTime = 0;double ProcessInfo::currTime = 0;

Test.h - 测试类

#ifndef _TEST_H_#define _TEST_H_#include "../module1/ProcessInfo.h"#include "../module1/Global.h"#include #include #include class Test{public:    Test(){};    static void TestAdd()    {        std::vector testVal(Global::bitNum, 0);        while (true) {            int flag = 0;            int tmp;            for (int i = Global::bitNum - 1; i >= 0; i--) {                if (i == Global::bitNum - 1) {                    tmp = testVal[i] + 1 + flag;                } else {                    tmp = testVal[i] + flag;                }                if (tmp >= 10) {                    flag = 1;                } else {                    flag = 0;                }                testVal[i] = (tmp % 10);            }            if ((ProcessInfo::currTime - ProcessInfo::startTime) > Global::expireTime) {                std::cout << "currTime: " << ProcessInfo::currTime << std::endl;                PrintTestVal(testVal);                break;            }        }        return;    };    static void PrintTestVal(std::vector& val)    {        std::cout << "testVal is: ";        unsigned int i = 0;        for (; i < val.size(); i++) {            if (val[i] != 0) {                break;            }        }        for (unsigned int j = i; j < val.size(); j++) {            std::cout << val[j];        }        std::cout << std::endl;    }};#endif
eae9e6915d8d41d17550b91dc8769402.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428222.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信公众号管理

微信公众号图文编辑 在新建图文时&#xff0c;如果有想插入的视频&#xff0c;可以采取获取视频链接再导入的方法&#xff0c;这样会更高效美观。 摘要和多个图文信息的重叠 新建图文信息&#xff0c;在设置封面旁边有图文摘要&#xff0c;图文摘要会在发送出去的界面旁边有显…

页面模板

找了半天的公众号模板&#xff0c;有点坑&#xff0c;微信公众号更新太快了&#xff0c;几个月不看都找不到使用功能了。 页面模板位置 页面模板在现在的话题专辑&#xff0c;如图: 在页面排版中可以实现我一直想要的菜单整理化功能 可以将文章整理后&#xff0c;发布在菜单…

SQL语句输出

select ,print均可以做输出 但如果想用print同时输出字符串和数字时&#xff0c;就需要遇到转换函数convert: declare allstudents int e.g.print’毕业人数为’convert(char,allstudents) 在执行时可能会遇到结果中显示了你的输出信息&#xff0c;而在消息中却没有&#xff0…

.NET面试题解析(04)-类型、方法与继承

转自:http://www.cnblogs.com/anding/p/5248973.html 常见面试题目: 1. 所有类型都继承System.Object吗&#xff1f; 2. 解释virtual、sealed、override和abstract的区别 3. 接口和类有什么异同&#xff1f; 4. 抽象类和接口有什么区别&#xff1f;使用时有什么需要注意的吗&a…

初学python的format之美

初学python的format之美 *区别于C语言的输出语句的是python的输出用的是"print"而不是“printf”。 1.简单的字符串和变量一起输出 python中的替代使用的是“{}” nameinput("请输入一个人的名字") countryinput("请输入一个国家的名字") prin…

20.链式队列

运行截图: 完整代码: 1 #include <stdio.h>2 #include <stdlib.h>3 4 #define datatype int5 6 typedef struct queue7 {8 datatype data;9 struct queue *pNext; 10 }Queue,*PQueue; 11 12 //入队 从尾部入,从头部出 13 PQueue enq(PQueue phead, dataty…

1到n阶乘算法的改进

1到n阶乘算法的改进 之前用到过好几次了&#xff0c;但总是很长时间不用就会忘了&#xff0c;所以这次直接把它扔进来了。 之前总是喜欢用双层循环&#xff0c;其实一个单层循环足以&#xff0c;下面将用Python和C两种语言进行展示 C&#xff1a; #include<iostream> …

lua 调用文件中的函数调用_深入Lua:调用相关的指令

前言这一节我们来深入解析与调用相关的指令&#xff0c;这些指令是&#xff1a;OP_CALL 调用OP_TAILCALL 尾调用OP_VARARG 可变参数OP_RETURN 返回解析这些指令的过程中&#xff0c;最重要的是时刻跟踪栈的变化情况。简单调用OP_CALL 的语法是&#xff1a;R(A), ... ,R(AC-2) :…

算法基础——列表查找

whats the 算法 算法&#xff08;Algorithm&#xff09;是指解题方案的准确而完整的描述&#xff0c;是一系列解决问题的清晰指令&#xff0c;算法代表着用系统的方法描述解决问题的策略机制。也就是说&#xff0c;能够对一定规范的输入&#xff0c;在有限时间内获得所要求的输…

Python画板画图之美

Python画板画图之美 *turtle.done() #可让画板窗口停止*1.绘制同切圆 pensize为画笔宽度 circle(n),n为半径大小&#xff0c;两者单位均为像素 import turtle turtle.pensize(2) #画笔宽度&#xff0c;单位为像素 turtle.circle(10) #圆半径&…

python request库_【Python爬虫】Request库入门

什么是爬虫&#xff1f; 网络爬虫&#xff08;又被称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在FOAF社区中间&#xff0c;更经常的称为网页追逐者&#xff09;&#xff0c;是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还…

world文档粘贴图片进去看不到

在大学做实验报告的时候经常要插入一些截图&#xff0c;往往会遇到直接复制粘贴图片会看不到的情况&#xff0c;会很烦&#xff0c;我自己也找了好多方法&#xff0c;下面是我最喜欢的简便方法的一种。 解决方法如下: 可以点击鼠标右键选择段落&#xff0c;将行距修改为1.5倍即…

c盘users的用户名怎么改_怎么修改iPhone备份文件夹路径 iPhone C盘路径修改教程【详解】...

iPhone备份文件夹路径怎么修改_iPhone C盘备份路径修改教程 我们都知道iPhone默认的备份是在C盘&#xff0c;不过现在各种视频、照片体积那么大&#xff0c;小小的C盘只怕是负荷不了了&#xff0c;那么有什么办法去修改备份路径呢&#xff0c;下面小编就为大家介绍一下。需要注…

javaweb开发的准备工作——配置篇

1.配置 a. jdk配置&#xff08;用于web开发编程&#xff0c;此处不需要配置path&#xff0c;只需配置环境变量即可&#xff09; b. tomcat配置 打开Tomcat&#xff08;打开bin目录下的startup.bat文件&#xff09; 检验是否打开成功(两个网址都可以&#xff0c;出现汤姆猫即为…

阅读引擎开源项目调研总结

农历腊月初二&#xff0c;也是冬至后的第四个九天&#xff0c;俗称“四九”。冬至这一天开始数九&#xff0c;这就是人们所说的“提冬数九”。数上9天是一九&#xff0c;再数9天是二九……数到“九九”就算“九”尽了&#xff0c;“九尽杨花开”&#xff0c;那时天就暖了。《九…

ftp 上传文件夹_命令行连接FTP服务器

Windows下&#xff1a;打开命令行窗口&#xff0c;输入 ftp&#xff0c;进入ftp命令模式&#xff1a;输入 open ip地址 端口&#xff0c;进入ftp服务器&#xff0c;如open 172.16.3.77 2121。如下图&#xff1a;输入Windows下的用户名&#xff0c;然后输入密码&#xff08;注意…

创建实现一个简单的web项目

创建一个新的web项目 注意要选择Dynamic Web Project&#xff0c;第一次用可能要找一下&#xff0c;也可以直接搜索栏搜web&#xff0c;就会出来 图片是我自己照片照的&#xff0c;不好截图&#xff0c;看到有个人影勿慌哈哈哈哈&#xff0c;不是你眼睛的问题。 然后在web文件目…

eclipse xml文件报错_Maven教程6: Maven与Eclipse整合

点击上方“Java技术前线”&#xff0c;选择“置顶或者星标”与你一起成长一、安装Maven插件下载下来的maven插件如下图所示&#xff1a;&#xff0c;插件存放的路径是&#xff1a;E:/MavenProject/Maven2EclipsePlugin进入到eclipse中的dropins目录下&#xff0c;新建三个txt文…

C语言#define宏定义可能注意不到的地方

#define使用的核心:直接替换 我也觉得自己很清楚这一点&#xff0c;但看到这一道输出程序片段结果题&#xff0c;还是懵了。大家也可以在不看我下方答案的情况下&#xff0c;自己做一下&#xff0c;题目如下: #include<stdio.h> #define P 3 #define S(a) P*a*a int mai…

结合JSP与HTML做一个九九乘法表

不说了&#xff0c;先上效果图&#xff0c;下面附有源码: 代码一:jsp表达式法 <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitio…