【问题标题】:Why does Android API ask for a results parameter as opposed to a return method?为什么 Android API 要求提供结果参数而不是返回方法?
【发布时间】:2013-04-02 13:40:50
【问题描述】:

我的问题是在整个 Android API 中,很多库调用都要求将 results[] 参数传递给方法,例如:

public boolean isInProximity(double startLat, double startLongitude, float meters) {
    float[] results = new float[3];
    Location.distanceBetween(startLat, startLongitude, endLatitude, endLongitude, results);
    return results[0] <= meters;
}

对 android 的调用是 Location.distanceBetween(),它需要 results[] 为什么他们不只是在方法中包含一个返回签名?我假设这是某种内存或速度优化。我不确定其背后的确切原因。

【问题讨论】:

  • 可能让您灵活地将同一个对象(在本例中为数组)传递给方法的许多调用,从而避免每次调用都需要分配内存。
  • 所以我认为我做错了private float[] results = new float[3];@RobI
  • 不一定。如果您不希望经常调用该方法(例如,仅在用户单击按钮时调用),则不太可能产生影响。如果您的代码调用它数百万次,您可以考虑将该数组作为字段来减少分配。
  • @Rob 我看不出在这种情况下你需要在哪里分配内存,尤其是在寄存器大小的变量的情况下。曾经发明的每一个调用约定(好吧,也许你可以找到一个没有的)都会将这样的返回值放入寄存器(我认为在 ARM 的情况下为 r0、s0 或 d0)。即使在更大的值的情况下,它仍然会被分配到堆栈上,这几乎是尽可能便宜的。
  • @Voo 我们谈论的是Location.distanceBetween() 调用的结果,它是一到三个浮点数。上面这个方法是提问者写的。

标签: java android performance optimization


【解决方案1】:

你说的没错,就是优化,这样你就可以多次调用这个方法,而不需要每次都分配内存。

编辑—— 这是一个测试:http://codeyarns.com/2010/10/21/c-return-value-versus-output-parameter/
迟到总比没有好。

【讨论】:

  • 引用一两个参考文献会显着改善这个答案。
  • 为什么必须为返回单个寄存器大小的值分配内存?即使是最简单的抖动也会将返回值放入 ARM 上的r0(这里是s0) - 根本没有分配内存..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
相关资源
最近更新 更多