HOME » 技術情報ブログ » 2022年5月

技術情報ブログ

技術情報ブログ 2022年5月 アーカイブ

はじめまして、富山オフィスの小坂です。
今年の4月で入社11年目になりました。
自分はまだまだ若い気持ちでいますが、新入社員の方を見ると歳を感じますね...。

さて、久しぶりではありますが技術ブログの更新です。
前回の更新が5年前のようで...スミマセン。

復帰第1回目のテーマは...
「C++ CString 文字列比較ってどれが速いの?」

Windowsのアプリ開発でよく使われているライブラリと言えば「MFC」が思い浮かぶと思います。(もしくはATL)
更にその中で、文字列を扱うクラスと言えば「CString」がありますね。
サイズを気にせず代入や結合が簡単にでき、フォーマットや文字列比較もできるという、至れり尽くせりな便利クラスです。

ということで、今回は「CString」について紹介していきたいと思います。
といっても全部紹介していると日が暮れるので「文字列比較」、更にはその「処理速度」にスポットを当てて話をしたいと思います。

文字列比較でよく見るコードは以下のような比較演算子を使った形ですね。
  1. CString str1 = _T("abc");
  2. CString str2 = _T("123");
  3. bool bSame = false;
  4. if (str1 == str2) {
  5.   bSame = true;
  6. }


上記のようなコードでもプログラム的に問題はありません。
しかし処理速度の観点から見ると、もっと良いコードが書けます。

ではどのようなコードが速いのか?
検証を行ってみたので、その結果を紹介したいと思います。

【検証内容】
以下の文字列の比較を 1,000,000回 行った速度を計測。

Vdk4jQnifyheeUVSJMAD2FdUXyCfR9HRTACieCMBVDguC3ALbU
vDK4JqNIFYHEEuvsjmad2fDuxYcFr9hrtacIEcmbvdGUc3alBu

使用した関数は以下の4つ。
  • Cstring::Compare
  • Cstring::CompareNoCase
  • _tcscmp
  • CStringの等価演算子(==)

【検証コード】
比較結果をbool型の変数に代入するだけのシンプルなコードです。
測定する関数以外のコードはコメントアウトしています。
  1. bool bSame = false;
  2. CString str1 = _T("Vdk4jQnifyheeUVSJMAD2FdUXyCfR9HRTACieCMBVDguC3ALbU");
  3. CString str2 = _T("vDK4JqNIFYHEEuvsjmad2fDuxYcFr9hrtacIEcmbvdGUc3alBu");
  4. // 測定start
  5. auto start = std::chrono::system_clock::now();
  6. for (int i = 0; i < 1000000; i++) {
  7.   //bSame = (0 == str1.Compare(str2));
  8.   //bSame = (0 == str1.CompareNoCase(str2));
  9.   //bSame = (0 == _tcscmp(str1, str2));
  10.   bSame = (str1 == str2);
  11. }
  12. // 測定end
  13. auto end = std::chrono::system_clock::now();
  14. // ミリ秒→秒 変換
  15. double dSec = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() * 0.001;
  16. // 出力
  17. CString strResult = _T("");
  18. strResult.Format(_T("%lf"), dSec);
  19. ::AfxMessageBox(strResult);

【検証結果】
結論:_tcscmpが一番速い
  • Cstring::Compare
  • 0.030
  • Cstring::CompareNoCase
  • 1.380
  • _tcscmp
  • 0.003
  • CStringの等価演算子(==)
  • 0.037
  ※5回計測した平均値、単位は[秒]

上記の結果を見ると、基本的には「_tcscmp」を使うのが良さそうですね!

【Tips】
今回の速度計測に用いたライブラリ「std::chrono」を簡単に紹介しておきます。
C++11から導入された標準ライブラリで、現在時刻の取得や時間計測ができます。

以下は処理時間を計測する時のサンプルコードです。
  1. auto start = std::chrono::system_clock::now();
  2. // この間に測定したい処理を書く
  3. auto end = std::chrono::system_clock::now();
  4. // 処理時間を取得(ミリ秒→秒に変換)
  5. double dSec = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() * 0.001;

応用すればラップタイムの出力もできるので、ぜひ使ってみてください!

以上、いかがでしたでしょうか?
ちょっとテーマがピンポイントすぎたかもしれませんが、皆さんのお役に立てれば幸いです。

次回も乞うご期待ください!
ありがとうございましたm(_ _)m

« 2017年2月 |  技術情報ブログトップページ  | 技術情報ブログの記事一覧  | 2022年8月 »

お電話でのお問い合せ:076-452-6280

メールフォームでのお問い合わせ・ご相談はこちら

弊社開発実績はこちら

新規開発からシステムリフォームまで、豊富な実績でお応えします。

ソフトウェア開発実績はこちら

製品パッケージのご案内

ワンストップで利用出来るハイテックスのパッケージソフトウェア。

製品パッケージはこちら

ハイテックスの特徴

経験豊富なスタッフがローコストで使いやすいソフトを開発します。

ハイテックスの特徴はこちら

よくある質問

システム開発についての疑問点に丁寧にお応えします。

よくある質問はこちら

料金の目安

ご予算に応じてシステムのご提案をいたします。

料金の目安はこちら

無料相談受付中

専門スタッフがシステムのご提案をいたします。

無料相談お申し込みはこちら

採用情報はこちら

経済産業省認定情報処理支援機関

Copyright Hitechs Inc. All Rights Reserved Worldwide.