搜索
写经验 领红包
 > 游戏

程序员代码梗(程序员的代码怎么写)

导语:作为程序员,这样坑的代码你写过吗?

今天很忙,下班已经十点多了,回到家将近十一点钟,这就是码农的生活日常吧。针对工作中遇到的几个小问题,聊聊解决方法和自己的认识,希望对看文章的你有所帮助。最近刚通过黄V认证,非常开心,欢迎关注我,以后多写技术文章。

问题代码

在白天的工作中,修改一位同事的代码,摘抄出来其中的一部分,一起看下有什么问题。由于技术水平不同,经验不同,写什么样的代码都正常,就像在日常工作中做code review,通过查找问题,共同提高,并不针对某个人。

代码片段一

RadomAccessFile raf = new RadomeAccessFile(somePath);raf.seek(offset);byte[] buffer = new byte[bufferSize];int readSize = raf.read(buffer);if (readSize > someValue) { doSomeThing();}

代码片段二

byte[] buffer = new byte[bufferSize];int size = file.read(buffer);byte[] newBuffer = new byte[bufferSize];for (int i = 0; i < size; i++) { newBuffer[i] = buffer[i];}

代码片段三

if (getBackupFile() != null) { File backupFile = getBackupFile();}private File getBackupFile() { File source = new File(sourceDir); for (File subFile : source.listFiles()) { if (subFile.getName().equals("backup")  && subFile.lastedUpdate() > someValue) { return subFile; } }} 
问题分析

这三段代码中,都存在比较明显的性能问题,你看出来了吗?

片段一:这段代码是判断新增文件的长度,如果超过某个特定的值,进行下一步操作。判断操作需要把新增的内容读到内存中,这显然是不合理的,IO操作是非常耗时的操作,和内存的数据读取有几个数量级的差距。这段代码修改也非常容易:

file.length() - offset > someValue

这样的写法虽然也有IO操作——读取文件信息,但比起来读取文件内容,已经进步了很多。

片段二:先不说是否需要拷贝,通过for循环每次拷贝一个字节,这样做是非常低效率的,应该用Arrays.copy方法,调用系统函数进行大数组的拷贝。其实,通过上下文发现,没有拷贝新的缓冲区,业务逻辑也能实现。

这段代码是在某一个函数中的,看到申请缓冲区,就要考虑大对象的申请也是非常耗时的。通过代码分析,函数的调用是单线程的,把缓冲区的定义和申请放到方法外面,就非常必要了。

片段三:这样的写法,就会调用两次getBackupFile函数,更致命的是,这个函数有IO操作,性能是非常低的。即使没有IO操作,也不建议这么写,应该先定义一个返回值对象,然后在进行判断,良好的编程习惯非常重要。

闲言碎语

1、函数调用只需要一条语句,其中的性能差异非常巨大,可能跨域了几个数量级。

2、写代码要有追求,实现功能是底线;不同的算法、逻辑导致效果差别巨大。

3、工作和学习,既要盯着前方,也要站稳脚跟——基础很重要。

就说这三点吧,共勉之。

本文内容由小纳整理编辑!