Image

Imagealex_mq0 wrote in Imageru_java

Тестирование

Хочу сразу сказать для тех кто ко всему относится слишком серьезно: это не тест претендующий на 100 правильность и точность, это просто информация к размышлению ;) пятничное развлечени, как удачно выразились ниже, ага ;)

Возникла потребность в тестировании быстродействия коллекций в Java. На арене выступали: String[] & ArrayList<String> тестировалась только скорость доступа на чтение к элементам коллекций.
2 забега:
    1. массивы заполненые одинаковой строкой
    2. массивы заполнены разными строками



import java.util.ArrayList;
import java.util.Random;

/**
 * User: alex
 * Date: 03.05.2007
 * Time: 21:46:17
 */
public class test {
    public static void main(String[] args) {
        ArrayList<Long> arrayTime = new ArrayList<Long>();
        ArrayList<Long> listTime = new ArrayList<Long>();


        int arrayLen = 1000;

        int count = 500000;


        String[] arrayString = new String[arrayLen];
        ArrayList<String> listString = new ArrayList<String>(arrayLen);


        System.out.println("Начинаем:");
        for (int i=0;i<arrayLen;i++){
            arrayString[i] = "testString";
            listString.add("testString");
        }

        long lastPersent = 0;
        long newPersent = 0;

        for (int i=0;i<count;i++){
            String testString = "";
            long l = System.currentTimeMillis();
            for (String a:arrayString){
                testString += a.charAt(0);
            }
            arrayTime.add(System.currentTimeMillis()-l);
            l = System.currentTimeMillis();
            for (String a:listString){
                testString += a.charAt(0);
            }
            listTime.add(System.currentTimeMillis()-l);
            newPersent = i*100/count;
            if (newPersent>lastPersent){
                lastPersent = newPersent;
                System.out.println(lastPersent);
            }
            testString = testString.substring(1);
        }

        long fullArray = 0;
        for (Long l:arrayTime){
            fullArray+=l;             
        }



        long fullList = 0;
        for (Long l:listTime){
            fullList+=l;
        }
        System.out.println("тест с одинаковыми строками");
        System.out.println("Всего: "+count+" итераций. По "+arrayLen+" операций чтений в каждой.");
        System.out.println("Полное затраченное время: ");
        System.out.println("Array:"+fullArray+" мсек");
        System.out.println("List :"+fullList+" мсек");
        System.out.println("В среднем на операцию доступа к элементу и присвоения:");
        System.out.println("Array:"+ (double) fullArray /count+" мсек");
        System.out.println("List :"+ (double) fullList /count+" мсек");

        arrayString = new String[arrayLen];
        listString = new ArrayList<String>(arrayLen);

        String randomPattern = "qwertyuiopasdfghjklzxcvbnmйцукенгшщзхъфывапролджэячсмитьбю";
        int stringLength = 200;

        int patternLength = randomPattern.length();
        Random rand = new Random();

        for (int i=0;i<arrayLen;i++){
            String tmp ="";
            for (int j=0;j<stringLength;j++){
                tmp+=randomPattern.charAt(rand.nextInt(patternLength));
            }
            arrayString[i] = tmp;
            listString.add(tmp);
        }

        lastPersent = 0;
        newPersent = 0;

        for (int i=0;i<count;i++){
            String testString = "";
            long l = System.currentTimeMillis();
            for (String a:arrayString){
                testString += a.charAt(0);
            }
            arrayTime.add(System.currentTimeMillis()-l);
            l = System.currentTimeMillis();
            for (String a:listString){
                testString += a.charAt(0);
            }
            listTime.add(System.currentTimeMillis()-l);
            newPersent = i*100/count;
            if (newPersent>lastPersent){
                lastPersent = newPersent;
                System.out.println(lastPersent);
            }
            testString = testString.substring(1);
        }



        fullArray = 0;
        for (Long l:arrayTime){
            fullArray+=l;
        }



        fullList = 0;
        for (Long l:listTime){
            fullList+=l;
        }
        System.out.println(">--------------------------------------------------<");
        System.out.println("Тест со случайными строками");
        System.out.println("Всего: "+count+" итераций. По "+arrayLen+" операций чтений в каждой.");
        System.out.println("Полное затраченное время: ");
        System.out.println("Array:"+fullArray+" мсек");
        System.out.println("List :"+fullList+" мсек");
        System.out.println("В среднем на операцию доступа к элементу и присвоения:");
        System.out.println("Array:"+ (double) fullArray /count+" мсек");
        System.out.println("List :"+ (double) fullList /count+" мсек");

    }
}



Результаты выполнения тестов следующие

тест с одинаковыми строками
Всего: 500000 итераций. По 100 операций чтений в каждой.
Полное затраченное время:
Array:28832 мсек
List :69384 мсек
В среднем на операцию доступа к элементу и присвоения:
Array:0.057664 мсек
List :0.138768 мсек


Использовались строки длинной 200 символов, состоящие из строчных русских и английских букв.

Тест со случайными строками
Всего: 500000 итераций. По 100 операций чтений в каждой.
Полное затраченное время:
Array:57635 мсек
List :138198 мсек
В среднем на операцию доступа к элементу и присвоения:
Array:0.11527 мсек
List :0.276396 мсек



-server опция hotspot
тест с одинаковыми строками
Всего: 500000 итераций. По 100 операций чтений в каждой.
Полное затраченное время:
Array:28313 мсек
List :68372 мсек
В среднем на операцию доступа к элементу и присвоения:
Array:0.056626 мсек
List :0.136744 мсек

Тест со случайными строками
Всего: 500000 итераций. По 100 операций чтений в каждой.
Полное затраченное время:
Array:56569 мсек
List :137263 мсек
В среднем на операцию доступа к элементу и присвоения:
Array:0.113138 мсек
List :0.274526 мсек



Из этого можно сделать вывод, что при высокопроизводительных операциях лучше использовать Array вместо ArrayList, так как при всем своем удобстве дает ощутимое падение производительности .
Если в вашей программе вы часто обращаетесь к массивам и тратите на это большую часть времени, стоит посмотреть в сторону простых массивов.
(UPDATE Ошибки - ошибки =))) падение на тесте в 2 раза, если не идет речь о чтении 100Гб, то смысла в этом большого нет, хотя я знаю одно место у себя в проекте кто выполнется оооочень похожая операция)

PS. У меня легкое разочарование... хорошо что бы кто-нибудь проверил, все ли корректно в тесте.
PPS Ошибки в тестике вообщем то поправил, получилось довольно внятно (уже не в 27 раз =) ) отличия в 2 раза похоже на истину больше чем старые результаты