不知道大家怎么看待为了提高代码运行效率,却不惜牺牲开发便捷性的做法。

2019-07-18 20:20:14 +08:00
 imdong

起因是与同事的一次争执(个人单方面挑起)。

简单说下现场情况:

PHP 开发,Laravel 框架。

第一件事:

一同事不满我于每次使用 Redis 都要先 Redis::connection();

他认为这次 connection() 会单独开一个 Redis 链接,性能损耗大。

而我认为直接使用魔术方法没有代码提示且 IDE 会标黄,看着不爽~

最后给他看 Laravel 源码,证明调用魔术方法本身也是先 connection() 然后调用方法。

而且证明 connection() 内并不一定会新创建链接。

事实上,Model 我也是先 query() 后 where()。

(这个我专门查过 Model 的源代码,都一样的,但 Redis 确实没查过。)

// 我的代码
Redis::connection()->pipeline();
// 他提议的
Redis::pipeline();
// 实际上 Redis::pipeline(); 的实现方法是
$this->connection()->{$method}(...$parameters);

第二件事:

我使用观察者来在订单 status 变更时记录到日志。

而他认为每次修改数据库都会触发观察者,性能损耗大。

而我主张,为了减轻服务器损耗,而提高人员的开发成本,得不偿失。

我的结论:

既然使用框架了,那为何不充分利用他便捷的特性呢?

追求极致的性能为何还要使用笨重的框架,直接原生手写代码就好了呀。

不知道是不是我的主张是错误的,求打醒。

========

不过我的脾气是真不好,当场就开怼了,要改,要改...

4066 次点击
所在节点    程序员
32 条回复
66450146
2019-07-18 20:46:33 +08:00
性能损耗大不大是要 profile 出来的,不是瓶颈的地方没有优化的必要
kzzhr
2019-07-18 20:46:37 +08:00
好耐心啊,直接让他压一下,看看他的写法提了有没有半个 qps 就行了
nine
2019-07-18 20:49:24 +08:00
(如果你写过要求高性能的程序就会知道)你同事是对的。
leeyuzhe
2019-07-18 20:53:29 +08:00
不服就压一下试试嘛,肯定是 qps 说了算
leekafai
2019-07-18 22:11:27 +08:00
好的程序员负责在瓶颈前实现需求,好的架构师负责将瓶颈提高,我觉得谁都没错
niubee1
2019-07-18 22:13:46 +08:00
提前优化是原罪,sin, 要吊起来烧死
Cbdy
2019-07-18 22:15:29 +08:00
优化考猜的吗?
rrfeng
2019-07-18 22:17:21 +08:00
pho 每个请求起进程的方式这里确实没必要优化。
如果是 fpm 常驻进程就有区别。
iEverX
2019-07-18 22:18:16 +08:00
不针对楼主的几个问题,因为不清楚其中的性能开销到底是多少。

> 而我主张,为了减轻服务器损耗,而提高人员的开发成本,得不偿失。
=======
这一点不一定一直成立,服务器成本不低的。特别是由于性能不行,不得已加多台机器,就会更高了。

> 追求极致的性能为何还要使用笨重的框架,直接原生手写代码就好了呀。
=======
就如上面几楼所说,性能评估肯定是压测压出来的。不用 php,不过 spring boot 服务,压测从从来瓶颈不在 spring boot。
chenqh
2019-07-18 22:25:34 +08:00
用 laravel 还讲究那么多?
mamahaha
2019-07-18 22:32:47 +08:00
过去在工厂都是先把东西做出来,先投入市场。如果口碑好批量上来了,再考虑降本增效,利润回报的大头都会从节降成本里产生。
如果研发阶段就降本增效,那只有两种情况,一种是系列产品换个马甲,还有一种是我也不知道。
Linxing
2019-07-19 00:21:54 +08:00
效率的基础上 提高性能 但是如果有大量的用户了 还是性能优先
ben1024
2019-07-19 00:36:47 +08:00
开发速度和开发者体验在没有遇到性能瓶颈前是最重要的
jinliming2
2019-07-19 01:01:41 +08:00
过早优化不好,但顺手优化还是赞成的……
勿以优化小而不为,毕竟积少成多。随手养成良好的习惯,实现同样效果的代码,坚持使用最优的,即便是多写几个字母。
但说了是随手优化,所以没有必要为了写法的优劣而吵架!!!
但如果对一段代码的优化明显占用了工时,那就没必要了,这种优化还是放到最后需要优化的时候,测测瓶颈再来考虑是否继续吧……
关于框架,我觉得不能过于依赖。框架是用来加速开发的,如果同样的功能原生代码可以快速实现,没有必要专门用框架封装的。特别是大型框架,能够用来帮你组织项目结构,帮你组织整个工程的逻辑结构,这就足够了,其他封装的方法都只是“语法糖”。这些封装的方法有的为了适应不同的执行环境而写了大量的分支判断,这个时候,自己针对项目用原生代码实现一个量身定做的封装岂不更好?
akira
2019-07-19 02:33:30 +08:00
你是要被打,我们是连数据库自带的触发器都不建议使用的,何况是这种触发器.
opengps
2019-07-19 06:59:00 +08:00
压测说明问题
palfortime
2019-07-19 07:47:31 +08:00
我只知道不好的框架使用习惯会被慢慢 copy/paste 到整个项目。如,service 层进门就打个 @Transactional,管它逻辑复不复杂,有没有外部调用;如,play 框架中所有函数返回都是 Promise<String>,map/recover 是什么,没有看过。
有些行为不加以纠正,那就希望项目涨量时,维护人不是你。
Fule
2019-07-19 08:47:04 +08:00
我觉得这个问题得两面看。如果是热点路径,那么每一点性能优化都是值得的,非热点路径,还是以便利性和可读性为主吧。不过总体来说,注重性能是一个好习惯。当然如果你们有压测的方法,那就用数据说话。
最后,这种事情没有绝对对错之分,也算是技术和思维切磋,不要太情绪化了。
Kilerd
2019-07-19 08:56:27 +08:00
没进来之前以为是吐槽 rust 的
jonsun30
2019-07-19 09:04:44 +08:00
参考 Uinx 哲学

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/584225

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX