解答例 - 実習課題1 - 1.バッファ
(実習課題1)
まず、以下の要件を満たすメソッドを作成して下さい。
- int型とboolean型の2つの引数を受け取る。
- 次の処理を10回繰り返す
- int型引数で指定された大きさのint型バッファを新規作成する。
- boolean型引数がtrueのときはダイレクトバッファ、falseのときは非ダイレクトバッファを作成する。
- バッファの先頭から順に0,1,2,...というように連番の数字を書き込む。
- メソッドの最後に、引数の内容とメソッドの処理にかかった時間をコンソールに出力する。
このメソッドを、バッファサイズ100/1,000/10,000/100,000/1,000,000、ダイレクトバッファ/非ダイレクトバッファすべての組み合わせで実行するコンソールアプリケーションを作成してください。
解答例
package com.techscore.nio.chapter1.subject1; import java.nio.ByteBuffer; import java.nio.IntBuffer; /** * Main.java * TECHSCORE NewIO 1章 実習課題1 * * Copyright (c) 2004 Four-Dimensional Data, Inc. */ public class Main { public static void main(String[] args) { Main buff = new Main(); int[] sizes = {100, 1000, 10000, 100000, 1000000}; for (int i = 0; i < sizes.length; i++) { int size = sizes[i]; buff.benchMark(size); } } // public void benchMark(int size) { private void benchMark(int size) { System.out.println("サイズ\t種類\t\t時間\t"); System.out.println("‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾"); benckMark(size, true); benckMark(size, false); System.out.println("‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾"); } private void benckMark(int size, boolean bDirect) { IntBuffer buffer = null; if (bDirect) { buffer = ByteBuffer.allocateDirect(size * 4) .asIntBuffer(); } else { buffer = IntBuffer.allocate(size); } long start = System.currentTimeMillis(); for (int i = 0; i < size; i++) { buffer.put(i, i); } int[] ints; boolean bOK = true; try { ints = buffer.array(); } catch (UnsupportedOperationException e) { System.out.println(e.getMessage()); bOK = false; } if (bOK) { System.out.println("OK!"); } long end = System.currentTimeMillis(); String bufferKind = bDirect ? "ダイレクト" : "非ダイレクト"; System.out.print(size + "\t"); System.out.print(bufferKind + "\t"); System.out.println((end - start) + "msec\t"); } }