微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Dart:在多次调用的方法中编写嵌套函数是否有效?

如何解决Dart:在多次调用的方法中编写嵌套函数是否有效?

请考虑以下代码

class A {
  foo() {
    int a = logicToGetA();

    int _bar() => someOtherLogic(a);

    // ..

    int b = _bar();

    // ..
  }
}

class B {
  int _bar(int a) => someOtherLogic(a);

  foo() {
    int a = logicToGetA();

    // ..

    int b = _bar(a);

    // ..
  }
}

main() {
  for (int i = 0; i < 1000000; i++) {
    A().foo();
  }
  for (int i = 0; i < 1000000; i++) {
    B().foo();
  }
}

说明:类A的bar()嵌套在foo()内,而类B的bar()嵌套在foo()之外。在第二种情况下,bar()也可以做成静态方法

我的疑问:如果多次调用foo(),哪种方法更有效?如果A()。foo()被调用1000000次,那么A.foo.bar是否会被重新定义多次?

解决方法

这取决于。

如果_bar函数可以在foo方法之外定义,那么我们可以假定它没有引用foo方法的任何局部变量。 在这种情况下,编译器 可以将本地函数优化为与实例方法一样有效。也许有,也许没有,所以让我们检查一下。

请参阅:https://dartpad.dev/4a53a91bf4e0006e4af4c8a598b68ee6。 这是(尝试的)编写的,因此编译器无法优化_someOtherLogic的调用。 我还尝试使调用成为静态方法(但随后必须将对象本身作为参数传递,才能访问flag的实例getter)。

在dartpad中运行此命令会给我最终的结果

A: 918460 /ms
B: 798960 /ms
S: 918380 /ms

与本地方法相比,使用本地功能的dart2js似乎更有效。 在VM上运行相同的代码可得出以下基准测试结果:

A: 625960.0 /ms
B: 723245.0 /ms
S: 625075.0 /ms

表明它的性能特征与dart2js完全相反。

很可能dart2js在静态已知时会内联_bar函数。 dart2js编译器在内联方面比VM更具攻击性。

总而言之,除非函数调用大量出现在真实程序的性能概要文件中,否则我不会担心这种差异。 如果您的程序的性能确实严格取决于此 one 函数调用,则可能会内联该函数。如果不是这样,请编写任何更具可读性和可维护性的内容,并且在您知道它很重要之前不要开始进行微优化。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。