スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

byte配列を16進数文字列に変換する際のパフォーマンス

  • 2014/02/19 15:14
  • Category: C#
C#でバイト配列を16進数文字列に変換する方法は色々ありますが、パフォーマンス的にはどの方法がいいのか少し検証してみました。
(あまり厳密にやった訳ではないので参考程度に)

検証対象
StringBuilder.AppendFormat
byte.ToString
Convert.ToString
BitConverter.ToString

約2MBのファイルを読み込んで、それぞれの処理時間を計測してみます。
BitConverter.ToString以外は文字列の連結にStringBuilderを使用しました。



結果
StringBuilder.AppendFormat1073ms
byte.ToString481ms
Convert.ToString379ms
BitConverter.ToString82ms

BitConverterが最も速いように見えますが、実際は文字列がハイフン区切りで返ってくるので
削除するにはReplace("-", "")する必要があります。
実際に行ったら183msかかりました。2倍越えてますね…
http://msdn.microsoft.com/ja-jp/library/3a733s97%28v=vs.110%29.aspx

またConvert.ToStringは他のメソッドと異なりA-Fは小文字に、0x00-0x0Fは先頭の0が削られ1桁になるようです。
http://msdn.microsoft.com/ja-jp/library/8s62fh68%28v=vs.110%29.aspx

基本的にはBitConverter.ToStringで十分でしょう。
しかし巨大なバイナリを扱うことを考えると、できるだけ高速化は行いたいものです。



というわけでLookupテーブルとポインタで4種類作りました。



4つ目のstringをint*で操作する方法はCodeProjectを参考にしてます。
http://www.codeproject.com/Tips/447938/High-performance-Csharp-byte-array-to-hex-string-t

結果
stringテーブル + StringBuilder71ms
charテーブル + char[]43ms
charテーブル + char[] + unsafe22ms
charテーブル + string + unsafe18ms

やはりポインタを使うと速いですね。
ちなみにリンク先のToHexStringで測ったら14msでした。


スポンサーサイト

Pagination

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。