问题问的大错特错。什么叫感觉一台计算机能花几分钟运行几行代码,看这一句,我猜题主是一个计算机专业的新生,编写代码的时候产生了这种疑问。但是如果你耐心继续学习,等到大二大三把一些专业课上完的话,就不会问出这种低级问题了。 编译和运行不一样 很多初学者分不清编译和运行,认为只要点击了IDE上的运行按钮,程序就开始运行了,其实这是错误的。就拿C语言为例,点击Clion或者visualstudio或者其他IDE上面的运行按钮之后,IDE会首先保存代码文件,然后开始编译,生成后缀名为。o的中间文件,然后根据头文件再把生成的和系统库链接在一起,最后才能生成可执行文件。 编译这个过程是一项非常复杂的工作,具体有多复杂,等到题主学了编译原理这门课就明白了。根据编程语言的设计不同,编译的时间也有长短之分,但是一般情况下都远远远远长于程序运行的时间。一旦编译完毕,就按照专业课上程序的复杂程度,基本上都是瞬间就可以运行完毕的。不信的话,可以在不修改代码的情况下在此点一下运行按钮,这时候就可以发现代码是瞬间运行完毕的。 现代处理器的运行速度是非常非常快的 我从小就对计算机非常感兴趣,每次学校发的计算机课本我都是第一时间看完,然后反反复复的来回看。没办法,谁叫当时家里没钱买电脑呢。所以计算机课本里面的一些内容,我至今仍然都记得。世界上第一台计算机叫做埃尼阿克,运行速度是每秒5000次加法。这个速度现在虽然看起来非常垃圾,但是还是远超手工计算的。那么现在处理器的运行速度是多少呢?我查了一下维基,2017年出厂的AMD锐龙1800x,每秒钟可以运行三千亿次指令。这还不是现在最新最强处理器,如果是现在新的处理器,速度只会更快。 之所以我们感觉程序运行慢,一般情况下都是因为出现了瓶颈拖累了处理器。例如下面的代码,将1000个数字打印到终端上。因为涉及了IO,所以会给人速度慢的错觉。要知道向终端输出是一件非常慢的事情。但是如果你通过重定向将输出转移到文件里的话,可以发现程序仍然是瞬间运行完毕。我曾经尝试过输出几百万的数据,导出到文件中也就是几兆的事情而已,也是瞬间完成的。 最后回到问题,首先程序运行速度和代码行数没有任何关系。如果是一个死循环,那么就算他很简单,也是永远也运行不完的。就算只调用了一个函数,可能这个函数背后有很大一坨逻辑,因而运行速度会受到影响。 然后是那些编程题,其实都属于小儿科的水平,纯运行的话,基本上都是瞬间就可以运行完成。之所以感觉到慢,要么是你把编译时间当成了运行时间,要么就是涉及到了IO等浪费时间的操作,不要因为有东西拖后腿就怀疑现在处理器的能力。 最后就是游戏了。游戏作为一个高度工业化的产品,做出来就是为了让玩家玩的爽,做出来就是为了赚钱的。那么游戏自然是一个经过高度优化的计算机程序,理所当然的可以发挥出处理器本身的水平。一般人玩游戏也就是读图的时候卡一下,加载完毕之后,可以顺顺当当的流畅游玩。这才是处理器本来就有的性能。 首先,这个需要看代码的底层处理量,代码岗书并不能代表他做的事情数量,例如你用了这个循环每次打印数字加一,并输出出来,循环上限1000万次。代码估计不超过5号,但计算机打印完,至少几分钟了,原因是打印过程很慢,涉及到io。又或者你的代码基本在底层执行,你只是写了2行代码,但时间这两行代码需要做大量的计算才能完成,类似于Python,其很多库对大量操作进行了封装,让使用者方便使用,但内部操作复杂。 而游戏运行是以帧来计算的,每一帧的处理量并不大,首先显卡专门负责图形渲染,cpu主要负责实时计算,每帧的计算量都在内存中运算,且计算量并没有太大,主要是显卡渲染的计算量大。 其次看使用的算法,好的算法可以大幅度降低运算时间,算法的好坏也是主要原因之一。 最后看使用的开发语言,越是高级的语言,运行速度越慢。 打个比方: 1。平面内三角形的内角和等于180度 2。任一大于2的整数都可写成三个质数之和 同样是一句话,前一句只要初中毕业,最多五分钟就能证明出来,后一句,从1742年至今也没人完全想明白。 您好很高兴回答您的问题。 您提出这样的问题,显然对计算机运算是不了解的,那么就让我一本正经的来解释一下,举个例子: 体育老师布置了一个任务,让小王和小张分别按不同策略跑一千米,小张和小王理论跑步的速度是一样的,但为什么小张要比小王先跑完? 小张的策略是,不停歇,以最高速度跑完。 小张的策略是,每跑两步休息一秒钟,每跑一百米喝一口水。 计算机执行任务速度与CPU频率、核心数量、内存、磁盘等诸多因素相关,但对于不同任务的执行时间,同一台计算机上主要取决于任务的差异性。在代码上来说,代码行数多少,并不能说明任务的复杂度,也不能单纯的将代码少的任务直接与执行时间挂钩。如一行sleep的代码就可以让这个任务休眠一万年。 以上,感谢您的阅读,我是源代码科技 首先介绍一下编程语言开发出来的程序是如何执行的。以java为例,java语言写出来的程序文件是xxx。java,这是无法直接被计算机执行的,需要经过编译器转换为成为字节码后,也就是xxx。class文件,才能被java虚拟机jvm读懂。但光有字节码还不够,计算机只能够读懂二进制命令,除了1和0之外,谁都不认识。因此还需要通过jvm的解释器将字节码翻译为机器可以执行的二进制文件,这样程序才能被计算机运行。 对新开发程序来说,需要被编译解释后才能执行,所以刚刚写出的代码,第一次运行的速度是很慢的。待运行过一次后,机器内存里便有了程序的二进制文件缓存,因此随后的运行就十分流畅了,无需在等待编译解释便可执行。 作为大型游戏来说,启动游戏之前也有一个较长的等待期,这时游戏界面上通常会出现一根进度条,这是游戏在进行预热。比如我们玩热门单机游戏《巫师3》时,打开后游戏有一段加载期,在这段时间内,游戏主程序在后台正忙碌的加载游戏引擎,构建人物、场景模型,加载缓存数据,当一切准备完毕以后,游戏主界面才会呈现在我们面前。当然如果计算机性能好,内存大的话,游戏资源可以获得足够的缓存空间,玩的过程就比较顺畅。如果内存不足的话,游戏资源没有足够的缓存,不得不退而求其次,在硬盘中加载数据,从硬盘读取数据可比内存慢的多,因而会造成游戏卡顿。 所以不能说运行代码要几分钟,而玩游戏却比较顺畅。游戏的主体部分也是由代码组成的,游戏启动时,与代码第一次运行一样,经历了加载预热,待准备完所有的资源后,才会出现游戏界面,我们才能尽情的畅玩其中。 那看你的代码运行啥了呗,写个死循环也不过两三行代码。 那不看看运行的是什么代码,我写个死循环一年都跑不完,写个sleep也能拖好久,如果写个00,跑到电脑蓝屏都跑不完 一行代码有可能只会让cpu跑一条指令,比如i;也有可能让cpu跑无数条指令,比如:while(1); 这行代码就能让cpu一直跑到它断电为止! 游戏可以理解成能够控制的动画,想象一下,你在看动画片的时候,能够对里面的角色直接操作,该有多爽! 这里就要谈到游戏的大致组成部分了,分别是素材和代码,素材就是你看到的部分,也就是最终呈现出来的动画,而代码就是让你操控这些动画用的。 打个比方,素材就是木偶人,而代码就是控制木偶人的线。 代码当然是程序代码,和一般程序没有任何区别。(除了设计目的不同,游戏代码对每秒输出的画面有严格要求,毕竟谁也不愿意玩PPT) 而素材包括:美术资源。比如地图、人物模型等。声音资源。比如背景音乐、枪击声等音效。游戏代码的作用 游戏中代码的主要作用就是把这些美术资源组织起来,按照一定的规则,呈现在电脑屏幕上。 比如你按下前进键,动画中的小人图片就向前移动。 游戏是由一帧帧画面组成的,当这些画面运动的极快时,就变成了动画。游戏运行的机制 当小人遇到了障碍,或者小人发射了一颗子弹,在电脑看来是怎样的呢? 我们举个例子。 假设我们在玩吃鸡类游戏,突然把敌人爆头了,电脑会如何处理呢? 电脑会根据你的位置和拿枪的姿势、枪的型号来计算子弹弹道,然后判断敌人是否位于弹道上、弹道前有没有墙(也被称作碰撞检测,还记得高中学过的解析几何吗?计算过程就是电脑在解数学物理几何题),当敌人被击中后,还要判断敌人的血量是多少,这一瞬间都在极短的时间内运算完毕,然后生成敌人被击败的画面。 简言之,整个过程包括两个部分:逻辑计算、画面渲染。画面更新的原理 我们所说的游戏30fps是什么意思?为何这个数值越大,画面越流畅? 对于一款30fps的游戏,即每秒输出30帧画面。所以数值越大,输入的画面越多,越接近人眼在现实世界里看到的,也就越流畅。 如果是30fps,用1秒除以30,大概就是33毫秒,电脑每输出一帧画面只有33毫秒的思考时间。 也就是说,每帧画面要在33毫秒左右就渲染完毕,这33毫秒一般是这样分配的:前16毫秒用于进行逻辑计算(包括接受你的输入,比如点击屏幕),后17毫秒用于渲染游戏画面。 帧数越高,留给逻辑计算和画面渲染的时间就越短。短时间内完成的计算量增多,对电脑性能的要求也就增多了。 知道了画面渲染更新的原理,我们就可以大致了解游戏卡顿的原因了。游戏卡顿的原理 有时候因为自己电脑太烂游戏优化太差(如育碧),导致游戏时常卡顿,这是为什么呢?(假设排除网络延迟的因素) 因为画面更新前,必须要经过逻辑更新(逻辑更新就是:先根据一些数据,经过计算,判断你是否击中敌人,再调用显卡生成敌人中弹的画面),有时候逻辑计算因为某些原因耗时过长,占用了这一帧画面更新的时间。 对游戏程序而言,数据更重要,因为这是判定一场游戏输赢的关键,所以这时也顾不得你看什么画面了,直接跳过这一帧的画面渲染。 对玩家而言,就是卡了一下,但正常情况下应该显示你中枪的画面,只不过电脑算不过来了。为何感觉游戏复杂却快?其他程序简单,电脑算起来却慢呢? 因为程序设计要根据需求而定,游戏对于实时性运算要求高,因此设计之初就要保证每秒输出的画面不能低于xx帧(一般是30fps),不然就需要程序员优化直至最终达到这个目标。为了达到这个目标,程序做了很多让步和牺牲,比如把人物模型简化成胶囊体或正方形。 在电脑的眼里,人物角色的形状就是一个胶囊形状,这样就能简化计算了。 而代码实际运行速度和代码复杂度有关,我们把某行代码比做让一个人搬砖,这样的代码很简单吧,但是搬一亿块砖,对应代码就是:让一个人搬砖,搬一亿块。 虽然每次搬砖的动作都很简单,但是连续搬一亿块,电脑就要花很多时间。 在你看来,这样简单的一行代码竟然要花费这么长时间,其实原因很简单,相信你早已清楚了。 大部分看似不复杂的代码,都有IO操作,比如与数据库交互,读写文件。还有一些会往控件上传递数据,比如ListView。这些操作都是比较耗时的。而游戏不需要太多的甚至没有IO操作,只是在内存中直接处理类似于字节数据之类的东西,然后把相应的图像显示出来,声音播放出来。 比如,游戏中一个人物需要从A地点走到B地点。后台只需要获取这两点的坐标,及两点之间是否有障碍物,完全是数学计算,计算机最拿手的东西了。可以参考A寻路算法。最佳路径直接在内存中计算出来了,只需要在路径上显示人物走路的不同模型就行了。看似复杂的东西转换成一个启发函数,就是单纯的计算问题了。而牵涉到IO操作的话,数据量一大,就跟传输方式及传输速率关系很大了。 我后续做一个简单的A寻路算法的demo,有兴趣的话题主可以研究下。 下图显示了两个红点之间的最短路径之一,根据启发函数的不同,最优路径也会不同。这就是为什么类似的游戏,比如dota1和dota2,ug在幽鬼之刃上移动的话一个要shift一个不要了