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

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 变更时记录到日志。

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

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

我的结论:

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

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

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

========

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

4076 次点击
所在节点    程序员
32 条回复
leo108
2019-07-19 09:04:47 +08:00
抛开业务谈优化都是耍流氓,抛开项目阶段谈优化更是耍流氓。
lance6716
2019-07-19 09:28:28 +08:00
我比编译器聪明
我战胜了标准库
我能管理好内存
misaka19000
2019-07-19 09:31:03 +08:00
原来写 PHP 是不需要考虑性能的,难怪 PHP 是世界上最好的语言
wweir
2019-07-19 09:34:59 +08:00
说实话,挺烦那种自身半瓶水,还天天提优化的人。
性能优化有自己的完整方法论,远不是那些道听途说的优化建议能解决的。

PS: 自己时常会做些过早优化的事,这是病,得治
gwybiaim
2019-07-19 09:38:54 +08:00
@lance6716 对对对,有人总认为自己比框架牛逼,比标准库性能高,比编译器更懂代码执行。哎,费心巴力写了一堆,可读性降了不少,性能还不见得好。关键等底层优化的时候,这堆自己写的逻辑不能方便的享受到底层优化带来的性能提升。
crackhopper
2019-07-19 09:39:03 +08:00
1. 不要太较真,他较真,带来的改变如果不太复杂,就接受就好了;要不然浪费精力。
2. 正是因为你们俩都没错,又都太较真,所以才会矛盾。
3. 提前优化是错误的,便捷性重要;能顺手优化掉的,优化掉也是正确的,毕竟也不会有太大麻烦,还养成个好习惯;
4. 错误的有:性能无法支撑业务的情况下,仍然快速撸业务(应该做 profile,进行一下优化,或者横向扩展);性能足以支撑业务的,花大量精力去优化(用一些非常识性高级优化技术,比如 SIMD,预测,unwind 之类的)。
jsjscool
2019-07-19 09:45:34 +08:00
// 他提议的
Redis::pipeline();

可能比你的方案要好些。

一是封装之后更容易扩展,比如连接之后打个日志,他只改一行,你可能要改一天。
二是 ActiveRecord 的设计哲学就是深度封装,能封装的都封装起,让上层知道的越少越好,你甚至都不需要知道用的 Redis 还是 MySQL,connection()就更不需要知道(只是猜测你们用了 ActiveRecord )。

至于性能,性能瓶颈真的是可遇不可求,遇到了至少可以吹 5 年。
ChoateYao
2019-07-19 09:49:56 +08:00
第二个问题确实是你的问题,应该是要在会修改订单状态的地方监听事件,而不是全局监听,全局监听虽然方便了你的开发,但是后期带来的问题苦不堪言。
lhx2008
2019-07-19 09:54:31 +08:00
用 laravel 等 PHP 框架还讲什么性能。。dump 调用栈,每个请求就执行几万行内置代码,redis 也做不了连接池。有啥区别。
lhx2008
2019-07-19 09:57:12 +08:00
不过,laravel 的数据库监听确实不好用,后续有新代码的时候,处处都要考虑旧的监听器。正确做法应该是手动发消息,不要啥都自动
1239305697
2019-07-19 10:55:59 +08:00
我也不用 query() ...
nekoyaki
2019-07-19 17:11:04 +08:00
是这样,优化有成本也有收益,我建议是你们根据你们的场景,平心静气求同存异,来合理评估一下高性能和快开发的好处和坏处,以后达成一致了大伙都好干活。
而且这个成本和收益也不是一直不变的,如果前头有一个耗时 30ms 且无法优化掉的操作,你把这个耗时 3 毫秒的操作优化成了 1ms,看起来是优化了三倍,但里外里的效用其实非常低。如果还让代码写起来更复杂了,那可能就不是一个很有必要的操作。
但如果你是把这个每天调十万次的操作从 30ms 优化到了 10ms,里外里就能省很多时间,省出来的时间就是服务器和人的钱。

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

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

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

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

© 2021 V2EX