【发布时间】:2021-04-05 14:03:59
【问题描述】:
已解决!查看 julemand101 的 cmets!
我正在测试颤振并遇到了一个小“问题”。该应用程序在调试模式下执行指令的速度似乎比发布时快得多,我想知道这是为什么。
当我使用“flutter run”运行应用程序时,这些是使用冒泡排序对 10 000、25 000 和 50 000 个整数进行排序所需的时间(以毫秒为单位): Debug Mode Times
当我使用“flutter run --release”运行应用程序时,排序时间越来越差,见图: Released App
我刚开始学习 Flutter,所以我保证很多东西都会低于标准,但这里是我使用的代码:
import 'package:flutter/material.dart';
import 'dart:math';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String results = "";
void _runTests() {
results = "";
var arr = loadArray(10000);
Stopwatch stopwatch = new Stopwatch()..start();
bubbleSort(arr);
timeTaken = stopwatch.elapsedMilliseconds;
String bubble10k = "Bubble Sort 10k: $timeTaken \n";
arr = loadArray(25000);
stopwatch = new Stopwatch()..start();
bubbleSort(arr);
timeTaken = stopwatch.elapsedMilliseconds;
String bubble25k = "Bubble Sort 25k: $timeTaken \n";
arr = loadArray(50000);
stopwatch = new Stopwatch()..start();
bubbleSort(arr);
timeTaken = stopwatch.elapsedMilliseconds;
String bubble50k = "Bubble Sort 50k: $timeTaken \n";
setState(() {
results +=
bubble10k +
bubble25k +
bubble50;
});
}
loadArray(n) {
var arr = [];
var rand = new Random();
while (arr.length < n) {
var r = rand.nextInt(1000000);
arr.add(r);
}
return arr;
}
bubbleSort(var array) {
int lengthOfArray = array.length;
for (int i = 0; i < lengthOfArray - 1; i++) {
for (int j = 0; j < lengthOfArray - i - 1; j++) {
if (array[j] > array[j + 1]) {
// Swapping using temporary variable
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
return (array);
}
insertionSort(var arr) {
int n = arr.length;
for (int i = 1; i < n; ++i) {
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
return arr;
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Results: ',
),
Text(
'$results',
style: TextStyle(fontSize: 25),
textAlign: TextAlign.center,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _runTests,
tooltip: 'Start',
child: Icon(Icons.add),
),
);
}
}
谁能解释这是为什么,或者我做错了什么?提前致谢。
【问题讨论】:
-
你能提供你写的代码吗?此外,
flutter run不是“调试模式”,而是使用即时 (JIT) 编译器运行应用程序,这在某些情况下实际上可以更快(因为它可以根据代码和运行时进行优化)但确实在它“热身”之前需要一些时间。 “发布”将使用 Ahead-Of-Time (AOT) 编译来编译应用程序,其中优化完全基于代码而不是运行时。 -
@julemand101 感谢您的回复。我现在已经用我正在使用的代码更新了问题。有没有办法通过 AOT 编译实现相同的“效率”,或者这根本不可能?
-
您可以开始帮助编译器,让您的代码更安全。现在,有很多
dynamic打字。此外,将您的代码移植到 nullsafety 以使其更加类型安全。 -
会这样做!再次感谢:)
标签: android performance flutter kotlin dart