创建小部件树时,const在静态小部件之前插入会提高性能吗?
即
child: const Text('This is some text');
Run Code Online (Sandbox Code Playgroud)
与
child: Text('This is some text');
Run Code Online (Sandbox Code Playgroud)
我知道,使用Dart 2 const是可选的,并且在某些地方会自动插入。这是其中一种情况吗?如果不是,使用会const减少内存使用/提高性能吗?
感谢您的回答!
Gün*_*uer 34
这是一个小的性能改进,但它可以在较大的应用程序或经常重建视图的应用程序中累积,例如由于动画。
const减少垃圾收集器所需的工作。
您可以启用一些 linter 规则analysis_options.yaml,告诉您何时应该添加,const因为它不是推断出来的,但可能像
或者在你使用时提醒你const但它是推断出来的
另见https://www.dartlang.org/guides/language/analysis-options
更新: 我注意到我最近收到了一个赞成票,我必须说我下面的测试可能是错误的。所以最好有人进行更好的测试。
我已经进行了一些测试,看看它是否有所作为。
这些测试主要基于本文中所做的测试。
对于测试,有 300 个容器,里面的文本在屏幕上随机移动。您在日常应用程序中不会看到的东西。
对于我的结果,每秒帧数和内存使用量没有区别,只是垃圾收集器在不使用 const 时似乎运行得更频繁。同样,FPS 大致相同。
Imo,性能提升可以忽略不计,听起来像是抢占式优化。然而,测试中没有深度嵌套的小部件链,但我看不出这会有什么不同。上面的文章似乎说有一个小的,但这不是我的测试显示的。
我有一张这样的卡(这是 const 版本):
import 'package:flutter/material.dart';
class MyCard extends StatelessWidget {
const MyCard();
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
margin: const EdgeInsets.all(8.0),
height: 100,
width: 100,
color: Colors.red,
child: const Text('Hi'),
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
它被渲染了 300 次并在屏幕上随机移动。
这是让他们移动的小部件
import 'package:flutter/material.dart';
import 'dart:math';
import 'dart:async';
import './my-card.dart';
class MovingContainer extends StatefulWidget {
@override
_MovingContainerState createState() => _MovingContainerState();
}
class _MovingContainerState extends State<MovingContainer> {
final Random _random = Random();
final Duration _duration = const Duration(milliseconds: 1000);
Timer _timer;
double _top = 0;
double _left = 0;
@override
void initState() {
super.initState();
initMove();
}
void initMove() {
_timer = Timer.periodic(
_duration,
(timer) {
move();
},
);
}
void move() {
final Size size = MediaQuery.of(context).size;
setState(() {
_top = _random.nextInt(size.height.toInt() - 100).toDouble();
_left = _random.nextInt(size.width.toInt() - 100).toDouble();
});
}
@override
void dispose() {
_timer.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return AnimatedPositioned(
top: _top,
left: _left,
child: const MyCard(),
duration: _duration,
);
}
}
Run Code Online (Sandbox Code Playgroud)
注意:我是 flutter 的新手,其他许多人也是如此,因为它是一个相对较新的框架。因此我的测试很可能是错误的,不要把它当作福音。当您阅读一篇名为《Flutter 性能第一》的文章时,也不要将其视为福音。我还没有看到有性能提升的实际证据。抢占式优化是一个甜蜜的谬论。
在颤振的情况下,真正的收获const是不具有较少实例。当窗口小部件的实例不变时,Flutter具有特殊的处理方式:它不会重建它们。
考虑以下:
Foo(
child: const Bar(
child: Baz()
),
)
Run Code Online (Sandbox Code Playgroud)
如果build再次调用方法(setState,父级重建,Inheritedwidget...),则由于constfor Bar子树,只会Foo看到其build方法被调用。
Bar将永远不会得到重建,因为其母公司,因为扑知道,因为小部件实例并没有改变,没有什么更新。
| 归档时间: |
|
| 查看次数: |
1342 次 |
| 最近记录: |