- リンクを取得
- ×
- メール
- 他のアプリ
- リンクを取得
- ×
- メール
- 他のアプリ
こんにちはドルフィンシステム福島です。
前回の投稿でU32をU8に変換する場合、型変換関数よりも数値分割関数が4倍高速に実行できる、というお話をしました。
「LabVIEWでU32をU8に4倍高速に変換する」
http://mikioblog.dolphinsystem.jp/2023/05/labviewu32u84.html
上記記事では、1つのU32数値を型変換関数や数値分割関数に渡してU8数値に変換し、それをforループで1M回繰り返した時間を計測しました。計測の結果は、数値分割関数が4倍高速でした。
しかし現実には一つのU32数値を変換するよりも、まとまった数のU32数値を配列の形で変換することが多いと思います。
今回は、各変換関数に配列の形で渡したときの変換時間をベンチマークします。
U32配列をU8配列に変換する
下図のようにベンチマークを行います。
- 事前に1MヶのU32配列を生成する
- 型変換関数、文字列に平坦化、数値分割関数の順でU32配列→U8配列の変換実行時間を計測する。
結果は、型変換関数が一番高速で、文字列に平坦化関数よりも13%、数値分割関数よりも2.5倍高速でした。
U32一つの変換では、一番時間が掛かっていた型変換関数ですが、配列を渡すととても高速に動作します。
数値分割関数は、U32→U16→U8→並べ替えというメモリ操作を伴う処理が入るので、余計に時間が掛かっているものと思います。
型変換関数の場合、32bit単位でアクセスするところを8bitでアクセスするだけなので、複雑なメモリ操作はなさそうです。
関数 | 時間(ms) |
型変換関数 | 3.7 |
文字列に平坦化 | 4.2 |
数値分割 | 9.2 |
double配列をU8配列に変換する
では次に、double型の変換を試して見ます。
数値分割関数はint型のみの対応で、double型に対応していませんのでベンチマークしていません。
こちらも型変換関数が10%程度高速に動作しました。
関数 | 時間(ms) |
型変換関数 | 6.6 |
文字列に平坦化 | 7.3 |
数値分割 | - |
複素数配列をU8配列に変換する
次に複素数配列をU8に変換してみます。
こちらは文字列に平坦化関数の方が4.9倍高速に動作しました。
関数 | 時間(ms) |
型変換関数 | 69 |
文字列に平坦化 | 14 |
数値分割 | - |
結果のまとめ
という訳で、前回の結果も含めて以下にまとめて置きます。
1サンプルの下表[型]の配列をU8に1M回変換する時間(forループ使用)
型 | 型変換 | 文字列に平坦化 | 数値分割 | 最遅/最速 |
U8 | 497.3 | 99.9 | 24.8 | 20.1 |
U16 | 493.3 | 79 | 25.5 | 19.3 |
U32 | 475.3 | 81.5 | 27.9 | 17.0 |
U64 | 502 | 80.2 | 34.2 | 14.7 |
single | 427.4 | 85.6 | - | 5.0 |
double | 427.4 | 85.6 | - | 5.0 |
complex (single) | 540 | 85.3 | - | 6.3 |
complex | 553.5 | 82.6 | - | 6.7 |
10Mサンプルの下表[型]の配列をU8に配列に変換する時間
型 | 型変換 | 文字列に平坦化 | 数値分割 | 最遅/最速 |
U8 | 4.9 | 6.5 | 15.5 | 3.2 |
U16 | 28.1 | 28.2 | 38.7 | 1.4 |
U32 | 38.4 | 44.6 | 94.6 | 2.5 |
U64 | 69.1 | 73.6 | 212.7 | 3.1 |
single | 39.1 | 44.7 | - | 1.1 |
double | 68.8 | 73.4 | - | 1.1 |
complex (single) | 511 | 85.6 | - | 6.0 |
complex | 569.7 | 149.5 | - | 3.8 |
一つの数値をU8に変換する→Int型なら「数値分割関数」、それ以外なら「文字列に平坦化関数」
配列の数値をU8変換する→複素数なら「文字列に平坦化関数」、それ以外なら「型変換関数」
以上、ドルフィンシステム福島でした。
- リンクを取得
- ×
- メール
- 他のアプリ
コメント
コメントを投稿