【Flutter×Rust】flutter_rust_bridgeでネイティブ性能を引き出す

image

この記事は、【 可茂IT塾 Advent Calendar 2025 】の20日目の記事です。

FFIとは

FFI (Foreign Function Interface) とは、あるプログラミング言語から、異なる言語で記述された関数やサービスを利用するための仕組みのことです。Flutterにおいては、Dart言語からCやC++、Rustといったネイティブ言語のコードを呼び出す機能を指します。

今回は、RustとDart実装と比較してどの程度「実行速度」が向上するかを計測します。

flutter rust bridgeを使用しました。

flutter rust bridgeとは

flutter_rust_bridge(FRB)は、Flutter(Dart)とRustをシームレスに接続するためのコード生成ツールです。

通常、FlutterからRustを呼び出すには「Dart FFI(Foreign Function Interface)」を使用しますが、これには手動での型変換やメモリ管理など、複雑でボイラープレート(定型コード)の多い作業が必要です。flutter_rust_bridgeはこれらのグルーコード(接着コード)を自動生成し、あたかも「単一の言語」で書いているかのような開発体験を提供します。


flutter rust bridgeの導入方法

V2の導入は非常にシンプルです。前提として、Flutter SDKとRust(Cargo)がインストールされている環境が必要です。

1. コードジェネレーターのインストール

まず、RustのパッケージマネージャーであるCargoを使って、FRBのCLIツールをインストールします。

cargo install flutter_rust_bridge_codegen

2. プロジェクトの作成(または統合)

新規プロジェクトを作成する場合

以下のコマンドを実行すると、FlutterとRustがセットアップされた新しいプロジェクトが作成されます。

flutter_rust_bridge_codegen create my_app

既存のFlutterプロジェクトに追加する場合

既にFlutterアプリがある場合は、プロジェクトのルートディレクトリで以下のコマンドを実行します。

flutter_rust_bridge_codegen integrate

これだけで、Rustのセットアップ(クレート作成)や、Flutter側の設定(Android/iOS/CMake等のビルド設定)が自動的に行われます。


使い方

導入が完了したら、実際にコードを書いてみましょう。基本的な流れは「Rustを書く」→「コード生成」→「Dartで呼ぶ」の3ステップです。

ステップ1: Rustで関数を書く

rust/src/api/ ディレクトリ(または lib.rs から参照される場所)に通常のRustコードを書きます。

// rust/src/api/simple.rs

pub fn hello(name: String) -> String {
    format!("Hello, {}! This is Rust.", name)
}

// 複雑な計算などもここに記述
pub fn add(a: i32, b: i32) -> i32 {
    a + b
}

ステップ2: コード生成(自動)

開発中は以下のコマンドを実行しておくと、Rustファイルを保存するたびにDart側のコードを自動生成(ホットリロード)してくれます。

flutter_rust_bridge_codegen generate --watch

ステップ3: Dartから呼び出す

生成されたコードを使って、Flutter側からRustの関数を通常のDart関数のように呼び出せます。

// lib/main.dart

import 'package:flutter_rust_bridge/flutter_rust_bridge.dart';
import 'src/rust/api/simple.dart'; // 生成されたファイルをインポート

Future<void> main() async {
  // 初期化処理
  await RustLib.init();

  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  // ... (省略)

  
  Widget build(BuildContext context) {
    return TextButton(
      onPressed: () async {
        // Rustの関数を呼び出す
        final message = await hello(name: "Flutter Developer");
        print(message); // "Hello, Flutter Developer! This is Rust."
      },
      child: const Text("Call Rust"),
    );
  }
}

ベンチマーク

ベンチマークでは以下の処理を比較しました:

  • Markdown parser
  • エッジ検出

注意: リリースモードでビルドすることが重要です。デバッグモードでは正確な性能測定ができません。

Markdown Parserのベンチマーク結果

以下は、軽量・中規模・重量の3種類のMarkdownファイルをDartとRustでそれぞれ1000回パースした結果です。

MarkdownSize(KB)言語試行回数平均時間最大時間最小時間合計時間
軽め0.04Dart10000.0ms0.2ms0.0ms43.9ms
0.40Dart10000.2ms1.1ms0.2ms223.1ms
重め80.23Dart100019.9ms22.3ms19.6ms19891.2ms
軽め0.04Rust10000.1ms1.6ms0.0ms70.8ms
0.40Rust10000.1ms0.8ms0.0ms74.0ms
重め80.23Rust10001.3ms4.9ms1.2ms1306.3ms

分析

  • 重いMarkdownファイル(80.23KB)の処理では、Rustの方が約15倍高速(Dart: 平均19.9ms vs Rust: 平均1.3ms)
  • 合計処理時間では、Dartが約19.9秒かかるのに対し、Rustは約1.3秒で完了
  • 軽量・中規模のファイルでも、Rustは安定して高速な処理を実現

エッジ検出のベンチマーク結果

画像処理(エッジ検出)のベンチマーク結果です。異なるサイズの画像に対して、DartとRustでそれぞれ処理を実行しました。

画像Size(KB)言語処理時間
138.32Dart619.3ms
213971.42Dart24188.4ms
38399.16Dart32782.3ms
138.32Rust9.6ms
213971.42Rust307.3ms
38399.16Rust335.3ms

分析

  • 画像1(38.32KB): Rustは約64倍高速(Dart: 619.3ms vs Rust: 9.6ms)
  • 画像2(13971.42KB): Rustは約79倍高速(Dart: 24188.4ms vs Rust: 307.3ms)
  • 画像3(8399.16KB): Rustは約98倍高速(Dart: 32782.3ms vs Rust: 335.3ms)

終わりに

ベンチマークリポジトリ: GitHub - flutter_rust_bridge_benchmark

より詳細な情報や最新のAPIについては、公式ドキュメント(https://cjycode.com/flutter_rust_bridge/)を参照することをお勧めします。

お知らせ

可茂IT塾ではFlutter/Reactのインターンを募集しています!(募集停止中)

可茂IT塾ではFlutter/Reactのインターンを募集しています!(募集停止中)

可茂IT塾ではFlutter/Reactのインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。

Read More
U30可茂ITインターンハッカソン

U30可茂ITインターンハッカソン

12月28,29日開催。2日間でアプリ開発の企画から完成までを目指す!U30可茂ITインターンハッカソンを開催します。

Read More

タグ

Flutter (127)初心者向け (32)イベント (19)Google Apps Script (17)Nextjs (13)可茂IT塾 (12)AI (9)React (8)riverpod (7)デザイン (7)Firebase (7)Figma (6)VSCode (6)JavaScript (6)ChatGPT (5)Slack (5)TypeScript (5)新卒 (4)就活 (4)Prisma (4)Dart (4)アプリ開発 (4)お知らせ (4)FlutterWeb (3)経験談 (3)NestJS (3)tailwindcss (3)ワーケーション (3)インターン (3)Web (2)Obsidian (2)Supabase (2)設計 (2)線型計画法 (2)事例 (2)Git (2)CSS (2)Freezed (2)Image (2)File (2)GitHub Actions (2)Material Design (2) (2)会社員 (2)画像 (2)Mac (2)iOS (2)React Hooks (2)社会人 (2)大学生 (2)RSS (1)Google (1)CodeRunner (1)vibe-kanban (1)NotebookLM (1)個人開発 (1)SVG (1)Android (1)Unity (1)WebView (1)Twitter (1)フルリモート (1)TextScaler (1)textScaleFactor (1)学生向け (1)Java (1)Spring Boot (1)shell script (1)正規表現 (1)table (1)テーブル (1)hooks (1)パワーポイント (1)ブックマーク (1)Pocket (1)ブクマク (1)MCPサーバー (1)OpenAI (1)ベクトル検索 (1)趣味 (1)モンスターボール (1)SCSS (1)Swift (1)MapBox (1)Cupertino (1)gpt-oss (1)生成AI (1)llama.cpp (1)LLM (1)ListView (1)postgresql (1)cloudrun (1)gcp (1)就活浪人 (1)既卒 (1)保守性 (1)iPad (1)シェアハウス (1)スクレイピング (1)PageView (1)画面遷移 (1)dotenvx (1)dotenv (1)Python (1)flutter_hooks (1)Gmail (1)GoogleWorkspace (1)ShaderMask (1)google map (1)Google Places API (1)GCPコンソール (1)Google_ML_Kit (1)Vercel (1)Google Domains (1)DeepLeaning (1)深層学習 (1)Google Colab (1)Google Chat Bot (1)Firebase Analytics (1)Gemini AI (1)コード生成 (1)GitHub Copilot (1)gemini (1)オンラインオフィス (1)html (1)オブジェクト指向 (1)クラスの継承 (1)ポリモーフィズム (1)LINE Messaging API (1)LINE Notify (1)LINE (1)Bitcoin (1)bitFlyer (1)コミュニティー (1)文系エンジニア (1)build_runner (1)ヒーター (1)作業効率 (1) (1)Flutter実践開発 (1)permission_handler (1)flutter_local_notifications (1)markdown (1)GlobalKey (1)ValueKey (1)Key (1)アイコン (1)go_router (1)FireStorage (1)debug (1)datetime_picker (1)Apple Store Connect (1)FlutterGen (1)デバッグ (1)Widget Inspector (1)VRChat (1)API (1)検索機能 (1)ローディング (1)Skeletonizer (1)Simmer (1)Shader (1)FFI (1)Rust (1)SharedPreferences (1)オフラインサポート (1)Navigator (1)メール送信 (1)FlutterFlow (1)Firebase App Distribution (1)Fastlane (1)Dio (1)CustomClipper (1)ClipPath (1)video_player (1)IMA (1)カスタム認証 (1)英語 (1)学習 (1)ポッドキャスト (1)アニメーション (1)Arduino (1)ESP32 (1)フリーランス (1)会社設立 (1)csv (1)docker (1)GithubActions (1)Dialog (1)BI (1)トラブルシューティング (1)エディタ (1)Cursor (1)sora2 (1)iPhone (1)Gemini CLI (1)Claude Code (1)LifeHack (1)ショートカット (1)Chrome (1)高校生 (1)キャリア教育 (1)非同期処理 (1)生体認証 (1)BackdropFilter (1)レビュー (1)Antigravity (1)getAuth (1)クローズドテスト (1)PlayConsole (1)Algolia (1)コンサルティング (1)Symbol (1)

お知らせ

可茂IT塾ではFlutter/Reactのインターンを募集しています!(募集停止中)

可茂IT塾ではFlutter/Reactのインターンを募集しています!(募集停止中)

可茂IT塾ではFlutter/Reactのインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。

Read More
U30可茂ITインターンハッカソン

U30可茂ITインターンハッカソン

12月28,29日開催。2日間でアプリ開発の企画から完成までを目指す!U30可茂ITインターンハッカソンを開催します。

Read More