Тестирование
Хочу сразу сказать для тех кто ко всему относится слишком серьезно: это не тест претендующий на 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(p atternLength));
}
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 раза похоже на истину больше чем старые результаты
Возникла потребность в тестировании быстродействия коллекций в 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 = 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(p
}
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 = 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 раза похоже на истину больше чем старые результаты
