プログラミングいちねんせい

プログラミング初心者が優雅にもがく軌跡です

演算子とStringBuilderで文字の連結の速度の違いを測定してみました

前回の続きです。ご存じない方は下記からご覧ください。

System.nanoTime()とSystem.nanoTime()

JAVAで速度計測するには代表する2つのメソッドがあるようです。それがSystem.currentTimeMillis()メソッドとSystem.nanoTime()メソッドです。それぞれの違いは数値の精度にあるようなので今回はSystem.nanoTime()を利用します。System.nanoTime()の2回目の取得時間から1回目の取得時間を引いて1000で割ったものがミリ秒になるので、それぞれを変数startendに代入して(end - start) / 1000としました。

最初は簡単な文字連結で試したのですが、あまりにも早すぎたのでforで2000回連結してみました。

今日は時間がないので結果を簡単に書きます。

プラス演算子で文字連結したOperator.javaを5回計測した平均値は14110226ミリ秒でした。 StringBuilderで文字連結したStringBuilder.javaを5回計測した平均値は14139477ミリ秒でした。

なぜかStringBuilderのほうが遅いという結果に終わりました。

疑問

  • for文での文字の連結の書き方が間違ってる?
  • System.nanoTime()の使い方が間違ってる?
  • 2000回程度では両者に差は出ない?

あとがき

モヤモヤが残ったのでまた試したいです。

初めてのコマンドプロンプトからのHello World!

北海道で温泉と魚介を堪能してリフレッシュしました!前回はJDKが期待通りに動かずにエラーが出てしまい途方に暮れた結果Windowsの再インストールを視野に入れたところで終わりました。というわけで続きです。

Windowsの再インストー

友達に聞いたところ「HDDのフォーマットとインストール自体は30分くらいで終わるけどUpdateに3~4時間はかかるよ」とアドバイスをもらったのでフォーマットとインストールは朝の支度のあいだに終わらせてWindows Updateを開始させてから仕事に行きました。帰宅後、無事に100件以上のUpdateが終わっていて一安心です。再起動させて追加でいくつかUpdateを終わらせました。そのあとはグラフィックドライバ、サウンドドライバと指示通りにインストールを済ませ、ひとまず終了です。

JDKのインストー

初心者はJDKやらJREやらに惑わされますが、結論から言うとJDKをインストールすればJREは必要ありません。JDKJAVAの開発環境を提供してくれます。その中には実行環境も含まれているのでJREも同梱されているというわけです。JAVAでコードを書くならばJDKのインストールだけでいいというのは勉強になりました。環境変数のPATHをJDKの実行ファイルのフォルダを指定したら早速テキストファイルでJAVAを書きます。

夢のHello World!

おなじみのHello World!の表示です。ファイルをCドライブ直下に作成したWorkフォルダに置いてテストをしました。コマンドプロンプトからjavac Main.javaを実行するとコンパイルが成功してWorkフォルダにあるclassファイルを確認しました。嫌な記憶が蘇りますが次にjava Mainと実行します。そして……Hello World!と表示されました!成功です!今までclassファイルの存在も知らずにEclipseに任せていたんですが、ここにきてやっとコンパイルしてからファイルを実行するという実感を得ました。

あとがき

明日はjavapや速度実測をやってみようと思います。

コマンドプロンプトからJAVAを実行するのに苦戦しています

コマンドプロンプトからJAVAを実行するのに苦戦しています

JAVAの勉強を始めたときに「コマンドプロンプトではなくIDEを使ったほうが効率がいい」という記事を読んだのでEclipseを使っていました。しかし、先日Twitterでアドバイスをいただきました。

「javac」という言葉は初耳だったのですが実はこれコマンドプロンプトからJAVAを実行するときに使うコマンドだったんです。そして調べてみるとJAVAコマンドプロンプトから実行させて仕組みを知ることが大切ということを知りました。その大切な部分をEclipseに任せていたばかりに簡単なHello Worldさえも実行できないトラブルに遭ったのでシェアします。

最大の敵の環境変数

私はWindows7JAVAの勉強をしています。そしてWindowsにはコマンドプロンプトというCUIが用意されています。起動方法はスタートボタンからアクセサリを選ぶかスタートボタンを押したときに表示される「プログラムとファイルの検索」のなかでcmdと入力すれば表示されます。

起動したら目的であるJAVAの実行ファイルがある場所へと移動します。私はFドライブのProgramming\JAVA\study\src\testフォルダにMain.javaを保存してあるのでf:と入力してFドライブに移動したあと目的のフォルダを指定します。cd programming\java\study\src\testと入力すると無事に移動できました。ここでjavac ファイル名.javaコンパイルできます。

javac Main.javaと入力すると何も起きることなく、さきほどのフォルダ名が表示されました。これでコンパイルは成功です。ここでエラーがあればエラー内容が表示されます。コンパイルが成功したら拡張子を入力せずにjava ファイル名で実行でるはずなのですがゴール手前で頭を抱える事態になりました。

java Mainと入力すると「エラー: メイン・クラスtest.Mainが見つからなかったかロードできませんでした」と表示されます。パッケージ名も入力したほうがいいという情報を見てjava test.Mainと入力しましたが全く同じエラーが返ってきます。javacと入力するとjavacのオプションが表示されるのでjavacは動いているようです。javac -versionjdkのバージョンを調べると1.8.0_131でした。java -version1.8.0_131です。これはJREJDKのそれぞれのバージョンを表示しているらしいです。

調べた結果「環境変数」「Path」「JAVA_HOME」「クラスパス」が鍵になるようですが環境変数からPathの値を;で区切り指定しても同じエラーに終始してしまい、検索した記事の解決策は全て試した状況なので今のところ打つ手がなく途方にくれています。気になるのはJDKが2種類あり古い方を参照しているようなのですが環境変数を全てチェックしても、古いJDKへのパスは見当たらないのでどうやって参照しているのかわかっていません。古いJDKを削除すると「JDKが見当たりません」とエラーが出るのでこれが疑わしいです。

使用PCが古く把握できていないことも多いので、この機会にWindowsを再インストールして環境をリセットするというのも、ひとつの手かもしれません。上手く解決できれば同じ原因で悩む方のヒントになったかもしれませんが今回は負け試合ということで終了です。

用語

  • IDE
  • CUI
    • Character-based User Interfaceの略でキーボードからの入力のみでソフトウェアを操作する仕組みです
  • JRE
    • JAVAを動かすための環境ファイルです
  • JDK
    • JAVAの開発環境ファイルです
  • クラスパス
    • JAVAが実行されるときにファイルの検索を効率的にするために指定するパスです
  • 環境変数
    • OSがアプリケーションに変数を渡すことができる機能

あとがき

問題は解決していませんがコマンドプロンプトでいろいろ入力するのは楽しいです。