русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Производительность


Дата добавления: 2015-06-12; просмотров: 558; Нарушение авторских прав


Хотя быстродействие «старого» ввода/вывода было улучшено за счет переписывания его с учетом новых библиотек nio, техника отображения файлов качественно эффективнее. Следующая программа выполняет простое сравнение производительности:

//: io/MappedIO.java

import java.nio.*;

import java.nio.channels.*;

import java.io.*;

 

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 void runTest() {

System.out.print(name + ": ");

try {

long start = System.nanoTime();

test();

double duration = System.nanoTime() - start;

System.out.format("%.2f\n", duration/1.0e9);

} 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(Tester test : tests)

test.runTest();

}

}

<spoiler text="Output:"> (90% match)

Stream Write: 0.56

Mapped Write: 0.12

Stream Read: 0.80

Mapped Read: 0.07

Stream Read/Write: 5.32

Mapped Read/Write: 0.02

</spoiler> Как уже было видно из предыдущих примеров книги, runTest() — не что иное как метод шаблона, предоставляющий тестовую инфраструктуру для различных реализаций метода test(), определенного в безымянных внутренних подклассах. Каждый из этих подклассов выполняет свой вид теста, таким образом, методы test() также являются прототипами для выполнения различных действий, связанных с вводом/выводом. Хотя кажется, что для отображаемой записи следует использовать поток FileOutputStream, на самом деле любые операции отображаемого вывода должны проходить через класс RandomAccessFile так же, как выполняется чтение/запись в рассмотренном примере. Отметьте, что в методах test() также учитывается инициализация различных объектов для работы с вводом/выводом, и, несмотря на то что настройка отображаемых файлов может быть затратной, общее преимущество по сравнению с потоковым вводом/выводом все равно получается весьма значительным.



<== предыдущая лекция | следующая лекция ==>
Отображаемые в память файлы | Блокировка файлов


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 1.856 сек.