Created
August 20, 2012 10:19
-
-
Save kirkch/3402882 to your computer and use it in GitHub Desktop.
Fast ways of writing to disk in Java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.io.*; | |
import java.nio.*; | |
import java.nio.channels.*; | |
/** | |
* Compares the performance of streaming data to disk vs using memory mapped files. | |
*. | |
public class MappedIO { | |
private static int numOfInts = 4000000; | |
private static int numOfUbuffInts = 200000; | |
private abstract static class Tester { | |
private String name; | |
public Tester(String name) { this.name = name; } | |
public long runTest() { | |
System.out.print(name + ": "); | |
try { | |
long startTime = System.currentTimeMillis(); | |
test(); | |
long endTime = System.currentTimeMillis(); | |
return (endTime - startTime); | |
} catch (IOException e) { | |
throw new RuntimeException(e); | |
} | |
} | |
public abstract void test() throws IOException; | |
} | |
private static Tester[] tests = { | |
new Tester("Stream Write") { | |
public void test() throws IOException { | |
DataOutputStream dos = new DataOutputStream( | |
new BufferedOutputStream( | |
new FileOutputStream(new File("temp.tmp")))); | |
for(int i = 0; i < numOfInts; i++) | |
dos.writeInt(i); | |
dos.close(); | |
} | |
}, | |
new Tester("Mapped Write") { | |
public void test() throws IOException { | |
FileChannel fc = | |
new RandomAccessFile("temp.tmp", "rw") | |
.getChannel(); | |
IntBuffer ib = fc.map( | |
FileChannel.MapMode.READ_WRITE, 0, fc.size()) | |
.asIntBuffer(); | |
for(int i = 0; i < numOfInts; i++) | |
ib.put(i); | |
fc.close(); | |
} | |
}, | |
new Tester("Stream Read") { | |
public void test() throws IOException { | |
DataInputStream dis = new DataInputStream( | |
new BufferedInputStream( | |
new FileInputStream("temp.tmp"))); | |
for(int i = 0; i < numOfInts; i++) | |
dis.readInt(); | |
dis.close(); | |
} | |
}, | |
new Tester("Mapped Read") { | |
public void test() throws IOException { | |
FileChannel fc = new FileInputStream( | |
new File("temp.tmp")).getChannel(); | |
IntBuffer ib = fc.map( | |
FileChannel.MapMode.READ_ONLY, 0, fc.size()) | |
.asIntBuffer(); | |
while(ib.hasRemaining()) | |
ib.get(); | |
fc.close(); | |
} | |
}, | |
new Tester("Stream Read/Write") { | |
public void test() throws IOException { | |
RandomAccessFile raf = new RandomAccessFile( | |
new File("temp.tmp"), "rw"); | |
raf.writeInt(1); | |
for(int i = 0; i < numOfUbuffInts; i++) { | |
raf.seek(raf.length() - 4); | |
raf.writeInt(raf.readInt()); | |
} | |
raf.close(); | |
} | |
}, | |
new Tester("Mapped Read/Write") { | |
public void test() throws IOException { | |
FileChannel fc = new RandomAccessFile( | |
new File("temp.tmp"), "rw").getChannel(); | |
IntBuffer ib = fc.map( | |
FileChannel.MapMode.READ_WRITE, 0, fc.size()) | |
.asIntBuffer(); | |
ib.put(0); | |
for(int i = 1; i < numOfUbuffInts; i++) | |
ib.put(ib.get(i - 1)); | |
fc.close(); | |
} | |
} | |
}; | |
public static void main(String[] args) { | |
for(int i = 0; i < tests.length; i++) | |
System.out.println(tests[i].runTest()); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment