【发布时间】:2011-02-23 14:27:49
【问题描述】:
我正在迁移一个非常以 JSP 为中心的项目以使用 Velocity。在许多地方,JSP 页面只是简单地解析字符串以显示各种内容。这使得 JSP 很丑陋,显然难以维护。
我已经修改了这个类的控制器来为我完成这项工作(即创建一个 POJO 列表),然后使用速度迭代这些片段。我有一种感觉,它会伴随着沉重的阻力而来。
我意识到创建对象会带来开销,但它使我们的页面更易于调试、编写和使用。除此之外,它将 UI 与后台发生的事情的核心逻辑分开。更不用说我们的应用服务器很无聊。数据库在痛苦中退缩。我们将看到用户数量增加了十倍(这可能就是为什么最初开发它是为了解析 JSP 中的字符串并跳过对象创建)——这对我来说是过早优化的味道。
还有哪些进一步的论据可以支持我的主张,即我们应该吃掉与创建对象相关的成本?
【问题讨论】:
-
“这对我来说是过早优化的味道” - 同意。我的意思是,Java 是一种面向对象 语言。为什么有人要避免使用对象? JVM 针对这些事情进行了优化。
-
如果您知道 JSP 和称为
pojo的(f)丑陋术语的工作原理......那么就不需要这个问题了。对象创建虽然不是免费的[任何最终字段都贵一点],但成本很小。您将数据库/jsp 和 java 对象创建放在一起。 Java 确实使用每个线程的小区域和非共享指针来分配新对象,所以它几乎就像堆栈分配(不是真的,但比大多数 c++ malloc impl 便宜) -
至少他们没有在 JSP 内部进行 JDBC 调用!我是这个团队的新手,所以我只需要确保在进行这些更改时涵盖我的基础。
-
忘记了,单独解析字符串会创建大量其他字符串,java.lang.String 是一个成熟的对象,并且还有另一个对象
char[](只有在使用 String.substring 时才能共享) 和另外 3 个ints。新字符串的对象创建与您自己的 pojos 的对象创建相当(取决于字段的数量)... -
进入 JSP 本身意味着已经创建了数百个(更多类似的)对象。将一个对象放入 java.util.HashMap 会分配一个对象(不是一个很好的例子,但它仍然会发生)。调用 ReenttrantLock.lock() 创建对象等等。不要害怕对象创建本身。