程序的性能与程序员的思维

原创 2007年09月18日 22:40:00
又有一段时间没有写blog了, 这段时间在忙着做实验, 写 一些perl的脚本程序, mining一些数据, 其实程序本身并没有什么, 但是刚开始的时候没有认识到, 要处理的数据量很大, 所以性能成为了程序的瓶颈.

我的工作主要是parse一个文本字符串, 将其中一些field 往数据库里面塞, 如果是处理100条这样的串, 那随便怎样都可以了, 读一行文件, 处理一行, 然后往数据库里面insert 一条记录; 如果处理的是 100 万 条数据, 那么就可以处理出1万行, 然后一次性插入数据库, 连着写 一万个 insert into values 的语句. 当然, 如果你嫌慢, 可以这样做, 开辟一个大的缓冲区 buffer1 读数据, 但后处理出来放入 buffer2. 让buffer2 往数据库里面塞. 当然了, 你还可以用多线程来加速这个过程, 如果用的是多核cpu 当然最好了.  如果这样你还觉得慢的话, 就可以用数据库的 bulk insert, 首先将buffer2 写入文件, 然后让数据库bulk insert 这个文件. 请你不要认为写文件会耽搁时间, 实际上 先写入文件再bulk insert 的速度 要比 连着 insert 数据库快 20 倍. 我做过这个实验. 用 C++, C# 插数据库要比 perl 快一些, 大约 perl 是 C++ 的 1.3 倍, 然后内存中一次性插入 多条 记录要比一次一条 快 2倍左右, bulk insert 比 用多条插入 快 20 倍.

所以推荐 大家 在大量的插入数据库的时候 , 可以先写成文件, 然后 一次让数据库批量导入.

可惜我面临的问题不是 100 万, 而是 1 万 个 100 万, 数据库可以 插那么多的记录, 可是如果我要 join 表 或者是 select 什么的, 就会很慢很慢了,  光是数 count 那就简单,  group by 一下就ok了. 如果我还是用bulk insert 的话, 那我再等半年可能数据才能处理完, 到时候都过年咯, 呵呵.

唉, 没办法, 只有考虑用 分布式 的数据库, 可见什么东西, 是有需要才用的, 没有那个必要, 就不会用了.

在此之前, 还写过一个简单的parser , 结果用 C# 实现同样的功能要快 10 倍, 因为我在 perl 的parser 里面加入了一些复杂的 正则表达式, 运算的复杂度很大, 一下子就慢了下来, 结果需要很快的跑出结果, 就需要重新思考.

就我个人经验, 很多时候, 刚开始写一个程序, 可能并没有意识到这个程序将要面临的挑战, 所以往往写完了改, 测试, 反正是总要出点问题才甘心的. 以前总是为了赶任务, 写的快, 现在才发现, 磨刀不误砍柴工啊, 以此提醒程序员兄弟们, 1天写 1万行程序, 其实不算什么的,  关键要看你这个程序 做了一些什么事情.

写好程序之后, 还请多思考思考, 这个程序处理这个问题合适吗? 时间上来的及吗? 还能够优化吗?
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

程序员应该用程序来思维,有空来研究一下狼 羊 草和农夫过河,将算法转换为代码《转》

题目描述:农夫需要把狼、羊、菜和自己运到河对岸去,只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,还有一个棘手问题,就是如果没有农夫看着,羊会偷吃菜,狼会吃羊。请考虑一种方法,让农夫能够...

程序员的思维修炼

  • 2016-07-14 09:35
  • 23.06MB
  • 下载

程序员的思维修炼.pdf

  • 2017-08-23 14:25
  • 23.06MB
  • 下载

一张思维导图学会如何构建高性能MySQL系统!

https://mp.weixin.qq.com/s/OBIOAjHo5k8ioNz-F2LoQA?utm_source=tuicool&utm_medium=referral 作者介绍...

程序员的思维修炼

  • 2015-11-21 21:33
  • 23.06MB
  • 下载

用架构思维从不同角度讲述性能测试的要点

大型网站中常用的基础架构模式和性能测试的方法和方向

程序员的思维修炼

  • 2016-10-08 17:50
  • 2.57MB
  • 下载

程序员的思维修炼

  • 2015-05-05 20:03
  • 23.07MB
  • 下载

convertView优化ListView性能 ViewHolder中介 Github 简明入门指南思维导图

这里提到的ListView只是作为一个典型代表 其实在Android中 采用类似Adapter机制的GridView等都是可以适用的 而ListView应该是用得最多的 所以就以它来举例 大家都知道...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)