こんにちは。いせりゅーです。
この記事は、「クソアプリ Advent Calendar 2023」のアドベントカレンダーになっております。
パフォーマンスが悪くなるやり方を考えてみた
他にもあるかもしれませんが、今回は3つを取り上げてみます。
- 頻繁な無駄なビルドをしてみる
- 大量のアニメーション
- 非効率なデータ構造の使用
頻繁な無駄なビルドをしてみる
以下のコードでは、タイマーが毎秒setState()を呼び出し、ウィジェット全体を再描画しています。これはとても非効率です。
import 'dart:async';
import 'package:flutter/material.dart';
class BadBuildScreen extends StatefulWidget {
  const BadBuildScreen({super.key});
  @override
  BadBuildScreenState createState() => BadBuildScreenState();
}
class BadBuildScreenState extends State<BadBuildScreen> {
  int _counter = 0;
  @override
  void initState() {
    super.initState();
    Timer.periodic(const Duration(seconds: 1), (Timer t) => _updateCounter());
  }
  void _updateCounter() {
    setState(() {
      _counter++;
    });
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Center(
        child: Text('Counter: $_counter'),
      ),
    );
  }
}
大量のアニメーション
このコードでは、100個の画像を含むリストを作成し、それぞれにフェードインアニメーションを適用しています。これはパフォーマンスに大きな負荷をかける可能性があります。
import 'package:flutter/material.dart';
import 'package:transparent_image/transparent_image.dart';
class ManyAnimationScreen extends StatelessWidget {
  const ManyAnimationScreen({super.key});
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: ListView.builder(
        itemCount: 100,
        itemBuilder: (context, index) {
          return FadeInImage.memoryNetwork(
            placeholder: kTransparentImage,
            image: 'https://pbs.twimg.com/profile_images/1642880523373789185/eNP5YbVw_400x400.jpg',
            width: 50,
            height: 50,
          );
        },
      ),
    );
  }
}
非効率なデータ構造の使用
このコードでは、各リストアイテムを表示するたびに、リスト全体を検索しています。これは非常に非効率的です。
import 'package:flutter/material.dart';
class InefficientDataStructuresScreen extends StatelessWidget {
  const InefficientDataStructuresScreen({super.key});
  @override
  Widget build(BuildContext context) {
    final List<int> largeList = List.generate(10000, (index) => index);
    return Scaffold(
      appBar: AppBar(),
      body: ListView.builder(
        itemCount: largeList.length,
        itemBuilder: (context, index) {
          return Text('Item ${largeList.where((item) => item == index).first}');
        },
      ),
    );
  }
}
これらのコードは以下のリポジトリに挙げております。
気になる方はクローンしてみてください。
最後に
パフォーマンスをよくする記事はいくつかありましたが、逆に悪くする記事がなかったので、思いつきで書いてみました。普通に考えて参考にしませんよね💦
しかし、コードを見た時に、同じようになっている!?という確認においては役立つと思います。
人気があれば、その2を作ります🔥
ちょっとした宣伝
株式会社ゆめみの23卒のメンバーでアドベントカレンダーを作成しています。
新卒のフレッシュな記事がたくさん投稿予定なので、少しでも興味があれば購読いただけると幸いです!!



