【まとめ】LabVIEWでU32をU8に4倍高速に変換する (2)

 こんにちはドルフィンシステム福島です。

前回の投稿で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ループ使用)

型変換文字列に平坦化数値分割最遅/最速
U8497.399.924.820.1
U16493.37925.519.3
U32475.381.527.917.0
U6450280.234.214.7
single427.485.6-5.0
double427.485.6-5.0
complex
(single)
54085.3-6.3
complex553.582.6-6.7


10Mサンプルの下表[型]の配列をU8に配列に変換する時間

型変換文字列に平坦化数値分割最遅/最速
U84.96.515.53.2
U1628.128.238.71.4
U3238.444.694.62.5
U6469.173.6212.73.1
single39.144.7-1.1
double68.873.4-1.1
complex
(single)
51185.6-6.0
complex569.7149.5-3.8


一つの数値をU8に変換する→Int型なら「数値分割関数」、それ以外なら「文字列に平坦化関数」

配列の数値をU8変換する→複素数なら「文字列に平坦化関数」、それ以外なら「型変換関数」


以上、ドルフィンシステム福島でした。


コメント