Учитывая URL-строку, как я могу прочитать все байты в память как можно быстрее? - PullRequest
0 голосов
/ 17 января 2012

Привет всем, учитывая строку URL, я хотел бы прочитать все байты (до указанного числа n ) в память как можно быстрее.

Мне было интересно, как лучше решить эту проблему?

Я придумал два решения, однако, поскольку интернет-соединение никогда не бывает постоянным, невозможно время методов, чтобы увидеть, что является более эффективным по времени, поэтому мне было интересно по праву , какая из этих двух функций должна быть более эффективной по времени? :

public static int GetBytes(String url, byte[] destination) throws Exception {
    //read all bytes (up to destination.length) into destination starting from offset 0
    java.io.InputStream input_stream = new java.net.URL(url).openStream();
    int total_bytes_read = 0;
    int ubound = destination.length - 1;
    while (true) {
        int data = input_stream.read();
        if (data == -1) {
            break;
        }
        destination[total_bytes_read] =(byte) data;
        if (total_bytes_read == ubound) {
            break;
        }
        ++total_bytes_read;
    }
    input_stream.close();
    return total_bytes_read;
}

public static int GetBytes2(String url, byte[] destination) throws Exception {
    //read all bytes (up to destination.length) into destination starting from offset 0
    java.io.InputStream input_stream = new java.net.URL(url).openStream();
    int total_bytes_read = 0;
    while (true) {
        int bytes_to_read = destination.length - total_bytes_read;
        if (bytes_to_read == 0) {
            break;
        }
        int bytes_read = input_stream.read(destination, total_bytes_read, bytes_to_read);
        if (bytes_read == -1) {
            break;
        }
        total_bytes_read += bytes_read;
    }
    input_stream.close();
    return total_bytes_read;
}

Тестовый код:

public final class Test {

    public static void main(String args[]) throws Exception {
        String url = "http://en.wikipedia.org/wiki/August_2010_in_sports"; // a really huuge page
        byte[] destination = new byte[3000000];
        long a = System.nanoTime();
        int bytes_read = GetBytes(url, destination);
        long b = System.nanoTime();
        System.out.println((b - a) / 1000000d);
    }
}

Результаты, полученные из моего тестового кода, таковы:

GetBytes:

12550.803514
12579.65927
12630.308032
12376.435205
12903.350407
12637.59136
12671.536975
12503.170865

GetBytes2:

12866.636589
12372.011314
12505.079466
12514.486199
12380.704728
19126.36572
12294.946634
12613.454368

По сути, мне было интересно, знает ли кто-нибудь о лучшем способе считывания всех байтов из URL в память, используя как можно меньше времени?

Ответы [ 2 ]

1 голос
/ 17 января 2012

Я предлагаю вам использовать JSOUP Java-парсер HTML.Я попробовал ваш URL с вашим кодом, используя JSOUP PARSER.И время, затрачиваемое на это, составляет 1/4 от времени.

      long a = System.nanoTime();
      Document doc = Jsoup.connect("http://en.wikipedia.org/wiki/August_2010_in_sports").get();
      String title = doc.title();
   // System.out.println(doc.html());  // will print whole html code
      System.out.println(title);
      long b = System.nanoTime();
      System.out.println( "Time Taken  "  +    (b - a) / 1000000d);

Вывод:

August 2010 in sports - Wikipedia, the free encyclopedia
Time Taken  3842.634244

Попробуйте это.Вам нужно загрузить JAR-файлы для использования JSOUP.

1 голос
/ 17 января 2012

Чем больше байтов вы читаете одновременно, тем быстрее они читаются. Каждый вызов read () опрашивает ваше устройство ввода и создает большие накладные расходы, если вы делаете это неоднократно. GetBytes2 () работает быстрее, чем GetBytes (). Потоки могут также увеличить скорость чтения, но лучшее решение - оптимизировать алгоритм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...