【问题标题】:Can passing an object to a method increase performance over sending individual parameters将对象传递给方法是否可以比发送单个参数提高性能
【发布时间】:2015-07-14 00:21:10
【问题描述】:

我被分配到优化应用程序性能的工作。

通常需要将 16-25 个参数传递给构造函数,并在那里设置它们。 我想为此创建一个类和对象并将这些值设置为对象然后传递。 读起来会很好。但它对我的任务有什么好处(即性能优化)?

【问题讨论】:

  • 无论性能如何,将这么多参数传递给构造函数都是一种代码味道。使用这么多参数,你很可能会出错(例如,反转两个相同类型的参数)。
  • stackoverflow.com/questions/5727336/…,应该可以帮到你。
  • 我建议在尝试优化之前对应用程序的各个方面进行分析,以确定瓶颈的实际位置。例如,任何涉及网络访问、编写不佳的数据库查询等。
  • @Bohemian 当然这是可能的。但是,如果您的参数对象用途较窄,则不太可能意外混淆不相关的参数。
  • @Shashank 你特别提到了“优化性能”。第一步是“衡量绩效”,这样你就知道哪些方面需要改进。我有一种强烈的感觉,如果存在性能问题,最好在某个地方找到一些效率极低的算法,可以重新设计,而不是搞乱方法参数的数量。

标签: java object optimization parameters


【解决方案1】:

它可能会稍微提高性能,但主要好处是增加代码的可读性。带有 16-25 个参数的构造函数不可读,而且很难使用。

当然,您应该只引入有意义的新类(即参数彼此相关)。为了将它们传递给构造函数,将 15-26 个不相关的参数推送到一个类是没有意义的。

【讨论】:

  • 为什么你认为它会提高性能?你不只是创建一个额外的对象吗?
  • @Keppil 您也许可以创建一次该对象并在许多地方使用。
  • @Keppil 好吧,在对构造函数的每次调用中复制一个引用而不是 15-26 可以产生小的差异。再说一次,实例化新对象也需要时间。这就是我写“它可能”的原因。如果您只创建一次该新实例并在多次调用另一个构造函数中重用它,它可能会带来一点改进。
  • 好点。我并不是说会对性能产生任何负面影响,我只是想听听您对任何可能改进的理由。
  • 一个用于传递参数的类允许您在不更改方法签名的情况下更改有效负载,而不会导致重大更改。可以说,如果参数进入一种方法,它们就定义相关。
【解决方案2】:

由此产生的性能差异(如果有的话)不太可能引起注意。

如果您的任务是解决性能问题,那么您的首要任务就是找出问题所在。您可以通过分析应用程序来做到这一点。您是否已这样做并证明问题出在参数传递中?

【讨论】:

    【解决方案3】:

    在现代软件中,在调用函数上有 25 个松散变量,然后将它们显式传递给方法或 ctor,这将是相当不寻常的。

    通常情况下,在 OO 设计中,这些变量会被打包到一个类(或几个类)中,并按其逻辑职责分组。

    由于Java 通过引用传递对象,因此在堆栈上传递单个对象引用可能会带来一些性能优势(推送到堆栈的变量更少)。然而,真正的好处是代码的可读性和维护性。

    但是必须注意,这样做需要在消费者和服务之间共享所传递对象的类 - 这可能是一个问题,具体取决于传输类正在建模的内容(例如,它是数据传输对象吗? 、业务实体、视图模型、XML/JSON 序列化对象等?)。如果在调用者和被调用者之间共享类型会违反您的架构,那么您通常会将 25 个变量映射到另一个合适的规范类(或类,再次观察 SRP 重构问题)并传递 this(这些),而不是。此时,不会有性能优势,但会保留可读性/可维护性优势。

    【讨论】:

      【解决方案4】:

      正如 oops 建议将多个属性协作到一个称为 class 的单元中,它由一个对象表示,因此它将提高代码的性能和准备度

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-30
        • 1970-01-01
        • 2010-11-22
        • 1970-01-01
        • 1970-01-01
        • 2015-10-07
        • 1970-01-01
        • 2021-11-11
        相关资源
        最近更新 更多