bio_img_japan-community

MATLAB ユーザーコミュニティー

MATLAB & Simulink ユーザーコミュニティー向け日本語ブログ

MATLAB のオブジェクト処理がこれから大きく高速化されます

※この投稿は 2026 年 7 月 14 日に The MATLAB Blog へ 投稿されたものの抄訳です。

MATLAB R2026b のプレリリースが公開されており、これにはまったく新しいオブジェクト管理システムが含まれています。ただし、これはデフォルトでは有効になっていません。有効にすると、この新しいシステムはオブジェクト指向 MATLAB コードを高速化できることを約束します。しかも、ほとんどの場合コード変更は不要です。場合によってはかなり高速になります。
これは MATLAB の言語実行バックエンドに対する大きな変更であり、説明すべきことがたくさんあります。この記事は連載の第 1 回で、何が起こるのか、いつ起こるのか、そして「ほとんどの場合はコード変更が不要」と言うときに私たちが何を意味しているのかをお伝えします。

リリース時期

ほとんどの人にとってほとんどの場合、コード変更は不要です。コード変更が必要になる可能性のあるケースは以下に記載します。ただし、これは MATLAB の実行エンジンに対する大きな変更であるため、次のように段階的に進めます。
  • MATLAB R2026b プレリリース: 限定ベータ版: テストしたいコードがあり、MathWorks のエンジニアリングチームとやり取りできる場合は ObjectPerformanceImprovementBeta@groups.mathworks.com まで連絡ください。
  • MATLAB R2026b: File Exchange Add-on を使って新しいオブジェクト管理システムに切り替えられるようになります。アドオンをインストールすると、特別なスイッチ付きで MATLAB を起動でき、その場合に新しいオブジェクト管理システムが有効になります。そのスイッチなしで MATLAB を起動した場合は、新しい管理システムを使わない MATLAB が起動します。また、MathWorks は、コード変更が必要かどうかを判断するためのツールも提供します。
  • 将来の MATLAB: 新しいオブジェクト管理システムはデフォルトで有効になりますが、必要に応じて無効化できます。
  • さらに先の将来の MATLAB: 新しいオブジェクト管理システムだけが唯一利用できるものになります。

どのような場合にコード変更が必要になりますか。

オブジェクトをまったく使わないコードは、この更新の影響をまったく受けません。オブジェクト指向 MATLAB コードの大半は従来どおりに動作し、おそらくかなり速くなります。
ただし、多少の作業が必要になるオブジェクト指向コードは少しだけ存在します。そして影響をうけるのはごく少数のユーザーだけだと見込んでいます。たとえば私自身、20 年以上 MATLAB を使っていますが、追加の対応が必要になるコードを書いたことは一度もありません。私たちはこのオブジェクト管理システムの変更を数か月にわたってベータテストしてきましたが、コード変更が必要になるケースはごくわずかしか見ていません。その少数のケースでも、変更はかなり軽微でした。
心配が必要なのは、あなたのコードがオブジェクト指向であり、しかも以下の 3 つの問題すべてに同時に当てはまる場合だけです。1 個、あるいは 2 個だけに当てはまるなら問題ありません。しかし 3 つすべてに当てはまる場合は、問題が生じる可能性があります。
  1. クラスにカスタムデストラクタが含まれている
  2. そのカスタムデストラクタが、破棄の正確な順序やタイミングに依存している
  3. オブジェクトが循環参照の中にある。循環とは、オブジェクト同士が互いを参照する参照ループのことです
なぜこの 3 つの問題が重要なのかと思う方のために言うと、今回、MATLAB がオブジェクトのライフサイクルを管理する方法を、より効率的なものへ更新したためです。その結果、JIT コンパイルされたコード内でオブジェクトをさらに最適化できるようになりました。詳細は近いうちにお伝えします。
R2026b のプレリリースでは、開発者と直接やり取りしたいと考えているので、コードが影響を受ける可能性があると思う場合はメール(ObjectPerformanceImprovementBeta@groups.mathworks.com)してください。新しいシステムへの切り替え方法、コードの確認方法、必要なら修正方法の案内をお送りします。ただ、影響を受ける可能性のあるコードの開発者でない限り、このチームにはメールしないでください。

どれくらい速くなるのか。

ここからが面白いところで、多くのことがかなり速くなります。もちろん効果の出方はケース次第で、500 倍超の高速化から、数パーセント程度の改善、最悪の場合はまったく変化なしまで見ています。この節では、どの程度を期待できるのかの感触をお伝えします。
言うまでもないことですが、性能向上の恩恵を受けるのは MATLAB オブジェクトを使うコードだけです。それ以外のコードにはまったく影響がありません。そのため、まずはオブジェクト指向プログラミングを多用するデモに注目しました。
最初のデモでは、Employee というオブジェクトの配列を作りました。プロパティは次のとおりです
classdef Employee
properties
EmployeeNumber = 1
RecordDate = datetime(2020, 1, 1)
Name = “Mike Croucher”
end
end
配列中の各 Employee には、1 から 7500 までのランダムな番号、ランダムな RecordDates などが設定されています。このクラスには比較演算子 < と > をオーバーロードしたメソッドもあり、これらは EmployeeNumber に対して動作します。これにより、これらのオブジェクトの配列に対して Bubble Sort、Insertion Sort、Quick Sort などの古典的なソートアルゴリズムを実装できました。次のアニメーションがその様子を示しています。
新しいシステムは、6 つすべてのアルゴリズムを 2 回実行するのに、旧システムが最初のアルゴリズムの約 10% を終えるのにかかる時間しか要しませんでした。アニメーション時間を除くと、M2 MacBook Pro では次のような計測結果になりました。
アルゴリズム
旧システム (秒)
新システム (秒)
高速化率
Bubble Sort / バブルソート
252.08
0.781
322.8x
Quick Sort / クイックソート
0.98
0.086
11.4x
Insertion Sort / 挿入ソート
95.6
0.29
329.7x
Selection Sort / 選択ソート
122.03
0.63
193.7x
Merge Sort / マージソート
1.21
0.132
9.17x
Heap Sort / ヒープソート
1.98
0.078
25.38x
念のため申し上げておくとここではコード変更は一切していません。単に新しいシステムを有効にしただけです。
オブジェクトをどのように扱うかが異なるからです。オブジェクトに関わる操作の中には大幅に速くなったものもあれば、改善がそれほど劇的でないものもあります。後でいくつかのベンチマークをお見せします。まずはオブジェクト指向のシミュレーション結果を紹介します。
私は古典的な Boids シミュレーションのオブジェクト指向版を書きました。各 Boid は、以下のプロパティと、その振る舞いを決めるいくつかのメンバー関数を持つクラスのインスタンスです。
classdef Boid
properties
x double = 0
y double = 0
vx double = 0
vy double = 0
end
end
新しいオブジェクト管理システムではシミュレーションが約 15 倍高速に動きました。これも Boids のソースコードには何の変更も加えていません。違いは下の動画で確認できます。
Boids は特に単純で、このシミュレーションを最速で実装するにはオブジェクト配列をやめて、位置と速度のベクトルを直接扱う方法が適しています。これはどのオブジェクト指向版よりも何倍も高速で、GPU 上で実行することさえできます。これはまた別の話ですが、OOP 実装とベクトル化実装の差は大幅に縮まったと言ってよいでしょう。
次のデモは、群衆の振る舞いを扱う、より複雑なエージェントベースシミュレーションです。ここでは各点が 1 人の人間を表し、右側にある複数のドアのどれかからシミュレーション領域を出ようとします。ルールは好きなだけ複雑にできますが、アニメーションで示した版ではかなり単純です。
新しいシステムでは、このシミュレーションは旧システムより約 100 倍速く動きます。 これもソースコードの変更は不要でした。以前なら OOP シミュレーションとして書くことが完全に非現実的だったケースが、今では非常に滑らかに動くことを示す例です。
ここまで、自分で実行できるものはまだ何も紹介してきませんでしたが、これらのデモのソースコードは追って公開する予定です。ここではいくつかのベンチマークを見てください。1 つのプロパティ、コンストラクタ、オーバーロードされた plus メソッド関数を持つ次のクラスを考えます。試したい場合は、この内容を次のファイル名で保存してください。tinyClass.m
classdef tinyClass
properties
Id (1,1) double = 0
end
methods
function obj = tinyClass(id)
arguments
id (1,1) double = 0
end
obj.Id = id;
end
function result = plus(left, right)
arguments
left (1,1) tinyClass
right (1,1) tinyClass
end
result = tinyClass(left.Id + right.Id);
end
end
end
これから 4 つの操作を計測します。
% Creating an array with 1000 tinyClass objects
values = createArray(1, 1000, “tinyClass”);
% Extracting a single element from an array
item = values(k);
% Swapping two elements in an array
temp = values(1);
values(1) = values(2);
values(2) = temp;
% Adding two scalar tinyClass objects
result = object1 + object2;
私が使った計測コードはこのブログの GitHub リポジトリにあり、以下が M2 MacBook Pro での結果です。
操作
旧システム (ナノ秒)
新システム (ナノ秒)
高速化率
1000 要素のオブジェクト配列を作成
776344.1
130148.6
5.97x
1000 要素の配列からオブジェクトを取り出す
1246.0
4.2
296.67x
1000 要素の配列内でオブジェクトを入れ替える
5767.2
9.3
620.13x
2 つのスカラーオブジェクトを加算
1511.1
64.1
23.57x

MATLAB における新しい高性能データ型への道を開く

オブジェクトに関わる基本操作でこれらの数値が出ているのを目にすると、新しいデータ型が MATLAB に登場する可能性への道が開けるのが exciting な点の 1 つです。木構造やキューのような構造は OOP で簡単に実装できますが、旧システムの MATLAB では処理が遅くなっていました。

既存コードの多くが何もしなくても速くなる

ここまでは、オブジェクトに対する操作を意図的に多用するシミュレーションとマイクロベンチマークに集中してきました。そのため、これらは今回の改善から期待し得るもっとも劇的な高速化です。本番コードではオブジェクトの使用はずっと少ない可能性があり、その場合の高速化は、あったとしてもかなり控えめになるでしょう。
新しいオブジェクト管理システムは、私たち自身のコードベース全体にも恩恵をもたらしています。さまざまなツールボックスからの例としては: / 次のようなものがあります:
また、この作業の結果として MATLAB のtable の処理が速くなった例もいくつか見つかっています。最も顕著なのは、幅の広い table の中央部分から列の塊を削除する操作で、私のマシンでは約 2〜3 倍高速です。以下は、あるユーザーのコードから抽出して最小再現例にしたものです。
T = array2table(rand(2200, 3320));
tic
T (:, 1495:1826) = [];
toc
私たちはこのような新しい例を今も次々に見つけており、皆さんが自分のコードを試す際にも同様の成果が得られることを願っています。

新しいオブジェクト管理システムは旧式 (R2007b 以前) オブジェクトには影響しない

あなたのオブジェクト指向コードが古い方式 (つまり classdef が 2008a で導入される前) で書かれているなら、そのコードの動作はまったく変わりません。そのようなコードは、クラスが @, like / で始まる名前のディレクトリで定義されていることで見分けられます。たとえば @polynom. / のようなものです。

この更新に関する詳細はいつ公開されますか。

MATLAB R2026b がリリースされたら、誰でも参加できるサポートパッケージを MATLAB File Exchange で公開します。また、新しいオブジェクト管理システムの詳細、カスタムデストラクタに関する 3 つの問題が重要な理由、そして新システムと互換性のない (願わくばごく少数の) コードをどのように修正するかについても、さらに詳しく公開します。
R2026b のプレリリースでは、まず開発者と直接やり取りしたいと考えているので、あなたのコードが影響を受ける可能性があると思う場合はメールしてください。新しいシステムへの切り替え方法、コードの確認方法、必要なら修正方法の案内をお送りします。
影響を受ける可能性のあるコードの開発者でない限り、このチームにはメールしないでください。

|
  • print

评论

要发表评论,请点击 此处 登录到您的 MathWorks 帐户或创建一个新帐户。