解答例 - 実習課題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");
}
}

