【问题标题】:Java Object creation vs. String parsingJava 对象创建与字符串解析
【发布时间】: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() 创建对象等等。不要害怕对象创建本身。

标签: java jsp migration


【解决方案1】:
  • 大约 15 年前,在 Java 中创建对象有点昂贵。从那时起,Java 运行时有了很大的改进。如今,Java 对象的创建通常比 C++ 更快。
  • 从未如此昂贵,以至于它将成为基本应用程序设计中的决定性因素。
  • 在 JSP 中做事意味着没有(甚至更少)对象被创建。恰恰相反,很有可能。 JSP 被编译为创建大量对象的完全正常的 Java 代码。
  • 听起来贵公司至少需要雇用一名真正了解 Java 工作原理的人。

【讨论】:

  • 听起来你的公司至少需要雇佣一个真正了解 Java 工作原理的人,很多公司都需要这个。你有一个很好的答案(没有+1,因为我不投票,但这是当之无愧的)
  • @kelloti,我认为添加更多问号会使问题更可靠?您可以查看个人资料以查看投票数。要回答,虽然不要粗鲁,不,我没有。我认为没有单一的原因。
  • @bestsss - (1) 它表明你很欣赏某人的回答。 (2) 它可以帮助人们轻松地剔除不好的答案并直接看到好的答案(堆栈溢出的整个点)。 (3) 它激励人们花时间给出好的答案
  • @kelloti,如果我需要表达谢意(诚然,这种情况非常罕见,但我应该这样做的时候),我会做我所做的,我会留下一个非匿名的评论。跨度>
  • @bestsss,请参阅有关投票的一些讨论。你可能会觉得很有趣。 meta.stackexchange.com/questions/80368/why-vote-on-answers
【解决方案2】:

对象创建很便宜。非常便宜。现代计算机速度很快。非常快。

做一些简单的分析。看看创建一百万个 POJO 需要多长时间。会很快的。

【讨论】:

  • 看看创建一百万个 POJO 需要多长时间。这是一个非常不合理的建议。大多数人完全不知道如何实现。适当的微基准。在单线程测试中分配一百万个小对象可能与多线程 web/app-server 完全不同
  • 我很沮丧。我想得到公认的答案。叹息。
【解决方案3】:

维护 - 大部分资金用于维护软件与开发。如果您使某些东西易于维护和扩展,那将是一件幸事。

在这个社区中,通常不赞成过早进行任何优化。你在什么样的硬件上运行?我想服务器可以处理你的工作量......我倾向于先让它运行良好,然后找到瓶颈的想法。分析对象时,您可能会发现创建对象并不是最大的问题。

【讨论】:

    猜你喜欢
    • 2011-03-07
    • 2014-11-22
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 2011-02-26
    相关资源
    最近更新 更多