关于函数调用速度的问题

在C,C++中,如果把主函数分成几个子函数,会不会速度更快?

5个回答

不会。

要想使程序运行速度更快,需要在算法、代码层次上面做优化。

函数调用要花时间的,可考虑反汇编成汇编语言代码看看。

当然不会,函数调用需要变量放入堆栈,跳转,都要开销。
当然,有些情况下会,比如你的函数是内联的,并且因为局部变量排列更紧凑,可能利用缓存的效率更高。但是通常来说不会。

当然不会,而且还会浪费效率!
因为函数调用时需要将参数入栈,保护现场(返回地址入栈,寄存器入栈),执行现场跳转,局部变量入栈,调用完成还要平衡堆栈,所以这样做速度会变慢!
调用函数具体细节请百度:调用约定

其实本身C++和C就已经不慢了,刻意去分开函数,也没有多大作用,顺其自然使用是最好的

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Java语言用函数调用计算速度降低,那么是不是可以不用函数
Java语言用函数调用计算速度降低,那么是不是可以不用函数Java语言用函数调用计算速度降低,那么是不是可以不用函数
MATLAB直接只加一个@能不能提升函数调用速度?
求问一下知不知道matlab中我在自己定义的一个function A中调用我之前定义的function B,我试过直接调用C=B可以成功,然后有点好奇我里面写 C=@B,这样会不会加快函数的调用速度呢
python循环调用函数,运行速度太慢
python3,编写了个主函数,主函数里面调用了一个函数,,现在对主函数循环调用,输出结果,运行速度太慢,有没有解决办法。
javascipt函数调用过程和值传递
``` <canvas id="canvas" style="border: 1px solid red ;" ></canvas> <script type="text/javascript"> var ball={x:512, y:100, r:20, g:2, vx:-4, vy:4, color:"#00FFFF"}//g重力加速度, window.onload=function(){ var canvas=document.getElementById("canvas"); canvas.width=768; canvas.height=768; var context=canvas.getContext("2d"); setInterval(function(){ render(context); update();},50) } function update(){ ball.x =ball.x+ball.vx; ball.y =ball.y+ball.vy; ball.vy =ball.vy+ball.g; if(ball.y>=768-ball.r)、 //请问这里的条件成立后,ball.y和ball.vy的值是值传递的吗? //两个ball.y和ball.vy传递之后,每调用update()方法是怎样是怎样的执行过程? { ball.y=768-ball.r; ball.vy=-ball.vy; } } function render(cxt){ cxt.clearRect(0,0,cxt.canvas.height,cxt.canvas.height); cxt.fillStyle=ball.color; cxt.beginPath(); cxt.arc(ball.x,ball.y,ball.r,0,2*Math.PI); cxt.closePath(); cxt.fill(); } </script> ```
求大神, 关于C语言的问题。
调用函数会不会减慢程序的运行速度? 我写多个子函数在主函数内调用还是直接在主函数内写运行更快?
调用父类构造函数super(color,wheel)出错
class Vehicle { private String color; private int wheel; public Vehicle() { System.out.println("调用了Vehicle的无参构造函数"); } public Vehicle(String color,int wheel) { System.out.println("调用了Vehicle的有参构造函数"); this.color=color; this.wheel=wheel; } public void show() { System.out.println("颜色为:"+color+" 车轮数量为:"+wheel); } public void calc() { float velocity=0; float distance=0; float t=velocity/distance; System.out.println("速度为:"+velocity+" 距离为:"+distance+" 行使该距离所需的时间为:"+t); } } class Car extends Vehicle { private String co; private int wh; public Car() { System.out.println("调用了Car的无参构造函数"); } public Car(String color,int wheel,String c,int w) { System.out.println("调用了Car的有参构造函数"); super(color,wheel); co=c;wh=w; System.out.println("小车颜色为:"+color+",车轮数量为:"+wheel); } public void consume() { double oil=0; float distance=0; double l=oil*distance; System.out.println("百公里耗油量为:"+oil+",距离为:"+distance+",行使该距离所耗的油量为:"+l); } }
C#调用VC++6.0的dll中问题
这是vc++中头文件#define GTDLL_API extern "C" __declspec(dllimport) short __stdcall 我在C#中引用 [DllImport("GT400.dll")] private extern static short GT_SetPos(int pos); 调用函数 private void SMotion() //S-曲线模式运动函数 { short rtn; rtn=GT_PrflS(); error(rtn); // 设置运动模式为S 曲线模式 rtn=GT_SetJerk(0.00000002); error(rtn); //设置最大加加速度为0.00000002 rtn=GT_SetMAcc(0.004); error(rtn); // 设置最大加速度为0.004 rtn=GT_SetVel(4); error(rtn); // 设置目标速度为4 rtn=GT_SetPos(80000); error(rtn); // 设置目标位置为80000 rtn=GT_Update(); error(rtn); // 刷新参数 } 就会出现 对 PInvoke 函数“测试!测试.Form1::GT_Home”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。 网上说的CallingConvention=CallingConvention.Cdecl试过,不可用呀! 求助大神。。。。
C++调用Python加载第三方库速度很慢怎么解决?
我用Cython实现了C++调用Python函数,但运行时加载第三方库的时间好长,请问如何解决呢?
java中panel实现线程接口以后,要调用repaint函数时,不进run函数
具体情况是 mypanel类实现了线程接口,在run函数中定义了sleep(100)后调用repaint函数,做一个小坦克游戏,在repaint之前要判断是否击中坦克,击中后要显示三张图片来体现爆炸效果,可是经过调试发现,每次第一次击中的时候,都是直接好多次repaint,没有休眠,后来发现根本就没有进mypanel的run()方法,好像有另一个其他线程再调用paint。这是怎么回事?感谢大家了 package com.TankGame; import java.awt.*; import java.util.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.*; public class MyTankGame1 extends JFrame{ public static void main(String[] args) { // TODO Auto-generated method stub MyTankGame1 tankgame = new MyTankGame1(); } //构造函数 public MyTankGame1(){ MyPanel mp = new MyPanel(); //启动mp线程 Thread t = new Thread(mp); t.start(); this.add(mp); this.addKeyListener(mp); this.setIconImage(new ImageIcon("TankImage/TANK.jpg").getImage()); this.setTitle("坦克大战"); this.setLocation(350, 100); this.setSize(500, 400); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } } //我的面板类 class MyPanel extends JPanel implements KeyListener,Runnable{ //定义一个玩家的坦克 MyTank mytank = null; Vector<EnemyTank> ets= new Vector<EnemyTank>(); //定义爆炸效果集合 Vector<Boom> boom = new Vector<Boom>(); int enSize = 8; //定义三张图片,三张图片组成一次爆炸 Image image1 = null; Image image2 = null; Image image3 = null; //构造函数 public MyPanel(){ mytank = new MyTank(100,250); mytank.setType(0); for(int i=0;i<enSize;i++){ EnemyTank et = new EnemyTank((i+1)*50,0); et.setType(1); et.setDirect(1); et.setType(1); ets.add(et); } //初始化图片 image1 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/1.jpg")); image2 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/2.jpg")); image3 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/3.jpg")); } public void hittank(Bullet b,EnemyTank et){ //判断该坦克的方向 switch(et.direct){ //方向朝上或者下 case 0: case 1: if(b.x>et.x&&b.x<et.x+20&&b.y>et.y&&b.y<et.y+30){ //击中 //子弹死亡 坦克死亡 b.isAlive=false; et.isLive=false; //创建一个爆炸效果,放入boom Boom bom = new Boom(et.x,et.y); boom.add(bom); } case 2: case 3: if(b.x>et.x-5&&b.x<et.x+25&&b.y>et.y+5&&b.y<et.y+25){ //击中 b.isAlive=false; et.isLive=false; Boom bom = new Boom(et.x,et.y); boom.add(bom); } } } //方向:上下左右,对应0123 public void paint(Graphics g){ super.paint(g); System.out.println("xx"); g.fillRect(0, 0, 500, 500); this.drawTank(this.mytank.getX(), this.mytank.getY(), g, this.mytank.getDirect(), this.mytank.getType() ); //从ss中画出所有子弹 for(int i=0;i<this.mytank.ss.size();i++){ Bullet b = mytank.ss.get(i); if(b!=null&&b.isAlive==true){ g.drawRect(b.x, b.y, 1, 1); } if(b.isAlive==false){ //从ss中删掉该子弹 mytank.ss.remove(b); } } for(int i=0;i<ets.size();i++){ EnemyTank et = ets.get(i); if(et.isLive){ this.drawTank(et.getX(), et.getY(), g, et.getDirect(), et.getType()); } } //画出爆炸 System.out.println(boom.size()); for(int j=0;j<boom.size();j++){ Boom bom = boom.get(j); if(bom.life>6){ g.drawImage(image1, bom.x, bom.y, 30, 30, this); }else if(bom.life>3){ g.drawImage(image2, bom.x, bom.y, 30, 30, this); }else{ g.drawImage(image3, bom.x, bom.y, 30, 30, this); } //让爆炸进行 bom.lifeDown(); if(bom.life==0){ boom.remove(bom); } } } //画出坦克的函数 public void drawTank(int x,int y,Graphics g,int direct,int type){ switch(type){ case 0: g.setColor(Color.cyan); break; case 1: g.setColor(Color.yellow); break; } switch(direct){ case 0://向上走 g.fill3DRect(x, y, 5, 30, false); g.fill3DRect(x+15, y, 5, 30, false); g.fill3DRect(x+5, y+5, 10, 20,false); g.fillOval(x+5, y+10, 10, 10); g.drawLine(x+10, y+15, x+10, y); g.drawOval(x+5, y+10, 10, 10); break; case 3://向右走 g.fill3DRect(x-5, y+5, 30, 5, false); g.fill3DRect(x-5, y+20, 30, 5, false); g.fill3DRect(x, y+10, 20, 10, false); g.fillOval(x+5, y+10, 10, 10); g.drawLine(x+10, y+15, x+25, y+15); g.drawOval(x+5, y+10, 10, 10); break; case 1://向下走 g.fill3DRect(x, y, 5, 30, false); g.fill3DRect(x+15, y, 5, 30, false); g.fill3DRect(x+5, y+5, 10, 20,false); g.fillOval(x+5, y+10, 10, 10); g.drawLine(x+10, y+15, x+10, y+30); g.drawOval(x+5, y+10, 10, 10); break; case 2://向右走 g.fill3DRect(x-5, y+5, 30, 5, false); g.fill3DRect(x-5, y+20, 30, 5, false); g.fill3DRect(x, y+10, 20, 10, false); g.fillOval(x+5, y+10, 10, 10); g.drawLine(x+10, y+15, x-5, y+15); g.drawOval(x+5, y+10, 10, 10); break; } } @Override public void keyTyped(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { // TODO Auto-generated method stub if(e.getKeyCode()==KeyEvent.VK_UP){ this.mytank.setDirect(0); this.repaint(); this.mytank.moveUp(); } else if(e.getKeyCode()==KeyEvent.VK_DOWN){ this.mytank.setDirect(1); this.repaint(); this.mytank.moveDown(); } else if(e.getKeyCode()==KeyEvent.VK_LEFT){ this.mytank.setDirect(2); this.repaint(); this.mytank.moveLeft(); } else if(e.getKeyCode()==KeyEvent.VK_RIGHT){ this.mytank.setDirect(3); this.repaint(); this.mytank.moveRight(); } } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub if(e.getKeyCode()==KeyEvent.VK_SPACE){ if(this.mytank.ss.size()<=4){ this.mytank.fire(); } } } @Override public void run() { // TODO Auto-generated method stub //每隔100毫秒重绘 while(true){ System.out.println("sleep"); try { Thread.sleep(30); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //判断是否击中 for(int i=0;i<mytank.ss.size();i++){ Bullet mb = mytank.ss.get(i); //判断子弹是否有效 if(mb.isAlive){ //取出每一个坦克,与子弹判断是否击中 for(int j=0;j<ets.size();j++){ //取出坦克 EnemyTank et = ets.get(j); if(et.isLive){ this.hittank(mb, et); } } } } this.repaint(); } } } //子弹类 class Bullet implements Runnable{ int x; int y; int direct; int speed=1; boolean isAlive = true; public Bullet(int x,int y,int direct){ this.x=x; this.y=y; this.direct = direct; } @Override public void run() { // TODO Auto-generated method stub while(true){ try { Thread.sleep(25); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } switch(direct){ case 0: y-=speed; break; case 1: y+=speed; break; case 2: x-=speed; break; case 3: x+=speed; break; } //子弹何时死亡? //判断子弹到达边界 if(x<-1||x>501||y<-1||y>501){ this.isAlive=false; break; } } } } //坦克类 class Tank{ //坦克的种类 int type; public int getType() { return type; } public void setType(int type) { this.type = type; } //坦克的速度 int speed = 1; public int getSpeed() { return speed; } public void setSpeed(int speed) { this.speed = speed; } public int getDirect() { return direct; } public void setDirect(int direct) { this.direct = direct; } int direct = 0; //坦克的横纵坐标 int x=0; public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } int y=0; public Tank(int x,int y){ this.x=x; this.y=y; } } class MyTank extends Tank{ Bullet mb = null; public MyTank(int x,int y){ super(x,y); } Vector<Bullet> ss = new Vector<Bullet>(); //开火能力 public void fire(){ switch(this.direct){ case 0: mb = new Bullet(this.getX()+10,this.getY(),0); ss.add(mb); break; case 1: mb = new Bullet(this.getX()+10,this.getY()+30,1); ss.add(mb); break; case 2: mb = new Bullet(this.getX()-5,this.getY()+15,2); ss.add(mb); break; case 3: mb = new Bullet(this.getX()+25,this.getY()+15,3); ss.add(mb); break; } Thread t = new Thread(mb); t.start(); } public void moveUp(){ y-=speed; } public void moveRight(){ x+=speed; } public void moveDown(){ y+=speed; } public void moveLeft(){ x-=speed; } } class EnemyTank extends Tank{ boolean isLive = true; public EnemyTank(int x,int y){ super(x, y); } } class Boom{ int x; int y; int life = 9;//爆炸的时间过程 boolean isLive = true; public Boom(int x, int y){ this.x=x; this.y=y; } //过程减少 public void lifeDown(){ if(life>0){ life--; }else{ this.isLive=false; } } } ``` ```
为什么C++通过JNI调用JAVA类函数速度慢近十倍?
很不解,多谢了。实在对不住,积分所剩不多。
visual studio调试asp.net程序时单步调试时进入函数内部很慢
我的页面采用三层架构,使用jQuery的ajax向后台的一般处理程序请求数据,数据量不是很大,最多也就 几十KB左右,我在一般处理程序中调用读数据库的数据的函数入口添加断点,然后按F11单步调试,从一般处理程序进入逻辑层的函数内部需要很长时间,接近一分钟左右!但是同一个请求,第二次请求时,速度又变得很快了。请问哪位高手遇到过这种类似的问题?有没有什么办法解决?谢谢。
如何提高文件写入硬盘的速度
在我的服务器上,由16个硬盘组成了RAID0,文件系统为NTFS,通过测试软件测出其 持续写入速度达到1500M字节/秒,但是通过无论是内存映射文件,还是直接调用 WriteFile函数,以及使用多个线程同时写入,每次写入的块大小调整(从64MB到 512MB都试过),各种方法都试过,写入速度也只能达到600MB/秒,请问通过什么 方法可以将速度提高到接近硬盘速度,谢谢
安卓控制闪光灯频闪发送信号问题
最近在研究一个东西,尝试通过手机闪光灯的高速频闪来传递比特串,然而现在的控制方法是通过调用安卓的Camera类来实现,频闪的速度非常慢,根本无法达到相应的要求。通过研究底层的调用关系,没有找到关于闪光灯的相关函数接口,有没有对于底层比较懂的大神帮忙分析分析。。。,譬如接管闪光灯的控制权等等。。。 现在的调用方法: ``` if (mCamera == null) { mCamera = Camera.open();// 打开照相机 // 设置照相机输出到纹理 mCamera.setPreviewTexture(new SurfaceTexture(0)); // 打开闪光灯 mParameters = mCamera.getParameters(); mParameters.setFlashMode(Parameters.FLASH_MODE_TORCH); mCamera.setParameters(mParameters); //mCamera.startPreview(); } ```
QFile 调用copy函数,csv文件,源文件与目标文件都无法正常显示?
Ubuntu系统下: QFile file("/tmp/1.csv"); file.open( QIODevice::WriteOnly); file.copy("/tmp/2.csv"); file.close(); 执行之前,1.csv可以正常显示。 内容如下: 119 2014050701 2014050702 是我izhognguoren 你是什么人呢速度发送对方 2014-05-19 12:42:46 120 2014050701 2014050703 是我izhognguoren 你是什么人呢速度发送对方 2014-05-19 12:42:48 执行完以后,1.csv 跟2.csv 都是乱码,无法正常显示。全是黑色问号: ������������������������������������������������������������������������������������������������������������������������������������������������������
C++多项目的解决方案中内联和DLL的使用优缺点?
在一个多项目的解决方案中,启动项目需要调用别的项目的各种函数。目前我们的做法几乎都是使用的内联函数,比用LoadLibrary方便多了。方便之余有点担心,因为DLL肯定是有它存在的必要的。所以想请问下,这样大量使用跨项目间的内联函数和将项目生成为DLL通过LoadLibrary调用相比较有没有什么隐患?安全性上?速度上?
MATLAB多重for循环嵌套的提速问题
新手不知道怎么选标签TAT 向各位大神请教一个问题:需要调用的函数里有十几个的输入变量等待被赋值,这些变量各自有各自的范围,现在想要把所有的可能性都列举出来并代入到被调用的函数中,最终可以得出每一种情况下的输出结果。目前全部使用的是for循环进行赋值,这样运算速度非常慢,请问该怎样提高运算速度? 代码部分如下: ``` OP.B_1 = 0.1:0.1:1.8; OP.B_2 = 0.1:0.1:1.8; OP.B_3= 0.1:0.1:1.8; OP.B_4 = 0.1:0.1:1.8; OP.B_5 = 0.1:0.1:1.8; OP.B_6 = 0.1:0.1:1.8; OP.B_7 = 0.1:0.1:1.8; OP.B_8 = 0.1:0.1:1.8; OP.f_1 = 50:50:1000; OP.phase_1 = 0:30:180; OP.phase_2 = 0:30:180; OP.phase_3 = 0:30:180; OP.phase_4 = 0:30:180; OP.phase_5 = 0:30:180; OP.phase_6 = 0:30:180; OP.phase_7 = 0:30:180; for i_B_1 = 1:length(OP.B_1) B(1,1) = OP.B_1(i_B_1); for i_B_2 = 1:length(OP.B_2) B(1,2) = OP.B_2(i_B_2); for i_B_3 = 1:length(OP.B_3) B(2,1) = OP.B_3(i_B_3); for i_B_4 = 1:length(OP.B_4) B(2,2) = OP.B_4(i_B_4); for i_B_5 = 1:length(OP.B_5) B(3,1) = OP.B_5(i_B_5); for i_B_6 = 1:length(OP.B_6) B(3,2) = OP.B_6(i_B_6); for i_B_7 = 1:length(OP.B_7) B(4,1) = OP.B_7(i_B_7); ``` ...后面还有很多循环,每次循环都要调用一次函数,请问有可以替代这种for循环的赋值方法嘛?多谢多谢!!_
如何实现python程序和C++程序的交互?
现在有一个项目的程序是用C++写的,它是一个游戏,这部分的代码比较多,有很多类和函数,然后我想用python训练神经网络作为这个游戏的AI。训练过程怎么说实现和C++游戏的数据通信呢? 如果用python调用C++,网上的一些方法只能调用一些简单的函数,调用类还会很复杂,而且我需要的不是调用一些写死的模块,是要连接两个程序。比如说,C++这边的游戏输出一个盘面状态的矩阵,python网络接受这些数据输出一个Action的矩阵,C++游戏接受这个Action矩阵之后程序内部进行裁决改变盘面状态的矩阵再输给python程序。 我需要实现的就是这么一个数据交互,而且希望速度比较快。 将神经网络用于强化学习和一些决策问题的时候,是不是模型都得用python来写呢?如果编程语言不同,训练起来是不是很慢?
请教一个JAVA线程的奇怪问题
在学习JAVA线程时候的遇到一个很奇怪的现象。让我们先来看代码 ```java public class TestThread { public static void main(String[] args) { IRun ir = new IRun(); Thread it = new Thread(ir); it.start(); try { Thread.sleep(1000); } catch (InterruptedException ex) { Logger.getLogger(TestThread.class.getName()).log(Level.SEVERE, null, ex); } ir.setStop(); } static class IRun implements Runnable { boolean exec = true; public void setStop() { exec = false; System.out.println("exec = " + exec); } @Override public void run() { int c = 0; while (exec) { c++; } System.out.println("退出了循环"); } } } ``` 在上述程序首先创建一个Runnable对象ir,然后创建一个线程对象it,通过it.start()启动线程,执行IRun类中的run()函数,执行一个while循环。while循环的条件由布尔变量exec控制。主程序中等待1秒钟后,修改exec的值为false,按照正常的逻辑应该是在exec值为false后,循环结束执行下面输出语句,然后线程结束,程序退出。 但是,上述代码在运行后,将不会执行run()函数中的System.out.println("退出了循环");语句,程序一直保持运行。对这种现象,在帖子”关于JAVA线程,请大神帮忙“中still_rain给出的这种现象的原因是线程访问的同步问题导致,当主线程(main函数所在的线程)中修改变量exec的值后,在创建执行的线程中访问的exec的值没有发生变化(或者说可能是主线程、执行线程这两个线程exec变量是不同的对象,好像是说java会将一些资源在每个线程中复制一份?有待确认)。在exec变量前加上volatile修饰符后,程序运行正常,问题似乎解决。 现在以上述代码为基础,进行一次小小的修改。在run()函数中的while循环中加上一个类对象操作,比如新建一个字符串,则run()函数为 ```java public void run() { int c = 0; while (exec) { String s = new String(""); c++; } System.out.println("退出了循环"); } } ``` 运行程序,程序按预期的顺序执行,顺利结束。这时候不管exec变量是否有volatile修饰符,且只在while循环中存在类对象操作(新建对象、对象函数调用(调用的函数不能返回基本数据类型),以及像System.out.println这样的操作),程序的运行都很正常,对这种现象就不是上述的同步问题能够解释的了。在帖子”关于JAVA线程,请大神帮忙“中still_rain(感谢热情的回复)从编译器优化的角度进行了解释。当while循环中只有简单的基本数据类型参与运算的时候由于执行速度太快,将while循环编译成了while(true)语句。导致循环不会退出,从而循环后的输出不会执行,且程序不会退出。 为了探究这个奇怪现象的原因,让我们看看编译后的字节码,下图是用jclasslib查看的字节码,是修改前的run()函数字节码。 ![](http://img.blog.csdn.net/20150210165255055?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmVuZ2Rhdmlk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 从图中可以看到,循环体从aload_0开始,到goto 2结束。控制跳转的语句是ifeq 15,意思是如果值为0则跳转到15,否则执行下面的语句。 当将上面的while(exec)语句修改为while(true)后,字节码为: ![](http://img.blog.csdn.net/20150210165209410?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmVuZ2Rhdmlk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 由两图可以看出,编译器并没有将while(exec)语句优化为while(true)。再看修改后的代码编译的字节码: ![](http://img.blog.csdn.net/20150210165320125?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmVuZ2Rhdmlk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 循环体从aload_0起,到goto 2结束。从ifeq 25下面的一行到astotre_2行,为String s = new String("");语句的字节码,将这段去掉则字节码与修改前的一样。所以基本可以排除编译器优化导致的程序不正常运行。 请看到这篇文章的大神们能够给予指导,探究出现这种情况的原因,谢谢
如何高效利用服务器CPU?当服务器上只有一个方法
我们现在在网络上有一台服务器专门用来运行算法,这个算法为matlab自动生成的dll文件,或者为单一matlab进程。算法的调用由c#实现。调用请求按照紧急程度分为2种,一种需要尽快返回结果,一种可以排队,不需要立刻返回。 但是实际过程中发现,不管算法由哪种方式提供,c#分线程进行调用的时候,都会在算法处排队。c#调用dll排队是因为dll在c#进程中只被复制一次,因此多个线程访问的都是同一方法。c#调用matlab进程排队是因为matlab只有单一进程,来自c#的计算请求会一个个进行。不管是哪种方式,发现cpu使用率都很低。 现在云提供商,升级服务器的时候都是把机器变成更多核心的,但是对于这种单方法的服务器来说,似乎无法提高运算速度(matlab内部对于for loop做bash计算另说)。有没有办法提高cpu使用率呢?或者让这个机器,能够多个同一方法同时调用? 我想到一个非常不规范的办法,不知是否可行。请大家提供建议! 将同一方法在dll中做上几个,每个函数名不同,然后c#在分出线程调用的时候,就可以同时跑‘同一’方法了(虽然函数名不同,但内容是一样的)。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
2019年还剩1天,我从外包公司离职了
这日子过的可真快啊,2019年还剩1天,外包公司干了不到3个月,我离职了
《面试宝典》2019年springmvc面试高频题(java)
前言 2019即将过去,伴随我们即将迎来的又是新的一年,过完春节,马上又要迎来新的金三银四面试季。那么,作为程序猿的你,是否真的有所准备的呢,亦或是安于本职工作,继续做好手头上的事情。 当然,不论选择如何,假如你真的准备在之后的金三银四跳槽的话,那么作为一个Java工程师,就不可不看了。如何在几个月的时间里,快速的为即将到来的面试进行充分的准备呢? 1、什么是Spring MVC ?简单...
计算机网络的核心概念
这是《计算机网络》系列文章的第二篇文章 我们第一篇文章讲述了计算机网络的基本概念,互联网的基本名词,什么是协议以及几种接入网以及网络传输的物理媒体,那么本篇文章我们来探讨一下网络核心、交换网络、时延、丢包、吞吐量以及计算机网络的协议层次和网络攻击。 网络核心 网络的核心是由因特网端系统和链路构成的网状网络,下面这幅图正确的表达了这一点 那么在不同的 ISP 和本地以及家庭网络是如何交换信息的呢?...
python自动下载图片
近日闲来无事,总有一种无形的力量萦绕在朕身边,让朕精神涣散,昏昏欲睡。 可是,像朕这么有职业操守的社畜怎么能在上班期间睡瞌睡呢,我不禁陷入了沉思。。。。 突然旁边的IOS同事问:‘嘿,兄弟,我发现一个网站的图片很有意思啊,能不能帮我保存下来提升我的开发灵感?’ 作为一个坚强的社畜怎么能说自己不行呢,当时朕就不假思索的答应:‘oh, It’s simple. Wait for me a few
一名大专同学的四个问题
【前言】   收到一封来信,赶上各种事情拖了几日,利用今天要放下工作的时机,做个回复。   2020年到了,就以这一封信,作为开年标志吧。 【正文】   您好,我是一名现在有很多困惑的大二学生。有一些问题想要向您请教。   先说一下我的基本情况,高考失利,不想复读,来到广州一所大专读计算机应用技术专业。学校是偏艺术类的,计算机专业没有实验室更不用说工作室了。而且学校的学风也不好。但我很想在计算机领...
复习一周,京东+百度一面,不小心都拿了Offer
京东和百度一面都问了啥,面试官百般刁难,可惜我全会。
20道你必须要背会的微服务面试题,面试一定会被问到
写在前面: 在学习springcloud之前大家一定要先了解下,常见的面试题有那块,然后我们带着问题去学习这个微服务技术,那么就会更加理解springcloud技术。如果你已经学了springcloud,那么在准备面试的时候,一定要看看看这些面试题。 文章目录1、什么是微服务?2、微服务之间是如何通讯的?3、springcloud 与dubbo有哪些区别?4、请谈谈对SpringBoot 和S...
Java 14 都快来了,为什么还有这么多人固守Java 8?
从Java 9开始,Java版本的发布就让人眼花缭乱了。每隔6个月,都会冒出一个新版本出来,Java 10 , Java 11, Java 12, Java 13, 到2020年3月份,...
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
python爬取百部电影数据,我分析出了一个残酷的真相
2019年就这么匆匆过去了,就在前几天国家电影局发布了2019年中国电影市场数据,数据显示去年总票房为642.66亿元,同比增长5.4%;国产电影总票房411.75亿元,同比增长8.65%,市场占比 64.07%;城市院线观影人次17.27亿,同比增长0.64%。 看上去似乎是一片大好对不对?不过作为一名严谨求实的数据分析师,我从官方数据中看出了一点端倪:国产票房增幅都已经高达8.65%了,为什...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试一个ArrayList我都能跟面试官扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
2020年1月中国编程语言排行榜,python是2019增长最快编程语言
编程语言比例 排名 编程语言 最低工资 工资中位数 最低工资 最高工资 人头 人头百分比 1 rust 20713 17500 5042 46250 480 0.14% 2 typescript 18503 22500 6000 30000 1821 0.52% 3 lua 18150 17500 5250 35000 2956 0.84% 4 go 17989 16...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
Idea 中最常用的10款插件(提高开发效率),一定要学会使用!
学习使用一些插件,可以提高开发效率。对于我们开发人员很有帮助。这篇博客介绍了开发中使用的插件。
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
立即提问