powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Разбивка на слова
17 сообщений из 42, страница 2 из 2
Разбивка на слова
    #39655857
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
тогда уж так
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public class Split {


    public static void main(String args[]) {
        long s = System.nanoTime();
        String text = "\"Сумма, руб.\", \"Сумма (без НДС), руб\", \"Кол-во\"";
        List<String> result = new ArrayList<>();
        int savedIndex = 1;
        int f = text.length() - 4;
        for (int index = 0; index < f; ++index) {
            if (text.substring(index, index + 4).equals("\", \"")) {
                result.add(text.substring(savedIndex, index));
                index += 4;
                savedIndex = index;
            }
        }
        result.add(text.substring(savedIndex, text.length() - 1));
        System.out.println(System.nanoTime() - s);
        System.out.println("Split string = " + result);
    }

}


Leonid KudryavtsevValentin Kolesnikov, substring.... жесть какаяоно того стоит
время выполнения 106 567
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655897
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Друзья. Родные. Драгоценные. Осадите коней. Вы сейчас один за другим продуцируете
фейерический поток сознания и еще дальше уводите в дебри бедного Андронова.

Для того чтобы доказать что в Java один метод (практически а не алгоритмически) быстрее другого
вы должны.

- подготовить среду тестирования. Как минимум сделать warm-up. Миллион способов как это сделать. Но только
не 1 раз вызвать метод main().
- подготовить репрезентативный набор 1000 - 10000 и более строк. И разных. И тех
которые будут похожи на настоящие. И учесть wors-cases (в одном поле - целая другая строка CSV)

Да и не смотрите в профилировщик. Стандартный вам не поможет. Он просто не покажет
вам rootcause вашего тормоза.

А еще лучше сделать шаг назад и подумать а зачем делать разбивку строки? Может надо делать
сразу целый файл? Stream?
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655908
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
я могу только повторить что уже сказал, что оптимизатор может и не подключиться в рантайме.
да такой метод сравнения очень относительный
но я запускал не один раз и видел что время скачет, я выбрал примерно часто встречающееся
разница в 100, и 10 раз позволяет с большой вероятностью судить о скорости.
я не думаю что настоящие тесты покажут обратное соотношение.
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655921
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы как нибудь так сделал. По скорости (на 10 повторах), примерно одинаково вариантом на substr'ах. Но по логике, потреблять памяти должно меньше.


От copy-past форматирование (отступы) немного уехали (((.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
package test_jvm;

import java.text.ParseException;
import java.util.*;

class Parser {
	public final static int M_INIT = 0;
	public final static int M_WAIT_QUOTE = 1;
	public final static int M_INSIDE_STRING = 2;
	public final static int M_WAIT_COMMA = 3;

	ArrayList<String> result;
    	
    char src[];
    int beginPos, endPos;
    int mode;
    
    Parser(  ) {
      mode = M_INIT;
    }
    
    private void processToken() {
    	String s = new String( src, beginPos, endPos-beginPos );
    	result.add( s );
    }
    
    public List<String> parse( String s) throws ParseException {
    	int len;
    	result = new ArrayList<String>();
    	src = s.toCharArray();
    	
    	len = src.length;
    	this.mode = M_WAIT_QUOTE;
    	for (int pos=0; pos<len; pos++ ) {
    		char c = src[ pos ];
    		
    		switch ( mode ) {
    		case M_WAIT_QUOTE:
    			switch (c) {
    			case ' ':
    				break; 
    			case '\"':
    				// String begin
    				this.beginPos = pos+1;
    				mode = M_INSIDE_STRING;
    				break;
    			default:
    				throw new ParseException( "Syntax error. Expected quote char.", pos );
    			}
    			break;
    		case M_INSIDE_STRING:
    			switch (c ) {
    			case '\"':
    				// String end
    				this.endPos = pos;
    				processToken();
    				this.mode = M_WAIT_COMMA;
    				break;
    			default:
    				break;
    			}
    			break;
		case M_WAIT_COMMA:
			switch ( c ) {
			case ' ':
				break;
			case ',':
				this.mode = M_WAIT_QUOTE;
				break;
			default:
				throw new ParseException( "Syntax error. Expected comma char.", pos );
			}
			break;
    		} 	// case
    	}	// for
    	// End of source string. Correct mode is only M_WAIT_COMMA
    	switch ( mode ) {
    	case M_WAIT_QUOTE:
		throw new ParseException( "Syntax error. Notting after last comma", len );
    	case M_INSIDE_STRING:
		throw new ParseException( "Syntax error. String not closed correctly.", len );
    	case M_WAIT_COMMA:
    		// OK
    		break;
    	}
    	return result;
    }
}

public class TestParser {

	public static void vadja( String text ) {
        long s = System.nanoTime();
        List<String> result = new ArrayList<>();
        int savedIndex = 1;
        int f = text.length() - 4;
        for (int index = 0; index < f; ++index) {
            if (text.substring(index, index + 4).equals("\", \"")) {
                result.add(text.substring(savedIndex, index));
                index += 4;
                savedIndex = index;
            }
        }
        result.add(text.substring(savedIndex, text.length() - 1));
        System.out.println( "time vadj="+(System.nanoTime() - s) );
        System.out.println("Split string (Vadja) = " + result);
	}
	
	public static void tigralen( Parser p, String text ) throws ParseException {
        long s = System.nanoTime();

        List<String> result = p.parse( text );
        System.out.println("time tigralen="+(System.nanoTime() - s) );
        System.out.println("Split string (tigralen) = " + result);
	}
	

    public static void main(String args[]) throws ParseException {
        String text;
        Parser p = new Parser();
        
        for ( int pass=0; pass<10; pass++ ) {
        	System.out.println( "***************" );
        	
        	text = "\"Сумма, руб.\", \"Сумма (без НДС), руб\", \"Кол-во\"";
        	vadja( text );
        	tigralen( p, text );
    		// ------------------
        	text = text + ", " + text + ", " + text + ", " + text;
        	vadja( text );
        	tigralen( p, text );
        	// ------------------
        }
    }
}



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
time vadj=10517
Split string (Vadja) = [Сумма, руб., Сумма (без НДС), руб, Кол-во]
time tigralen=4808
Split string (tigralen) = [Сумма, руб., Сумма (без НДС), руб, Кол-во]
time vadj=21033
Split string (Vadja) = [Сумма, руб., Сумма (без НДС), руб, Кол-во, Сумма, руб., Сумма (без НДС), руб, Кол-во, Сумма, руб., Сумма (без НДС), руб, Кол-во, Сумма, руб., Сумма (без НДС), руб, Кол-во]
time tigralen=13821
Split string (tigralen) = [Сумма, руб., Сумма (без НДС), руб, Кол-во, Сумма, руб., Сумма (без НДС), руб, Кол-во, Сумма, руб., Сумма (без НДС), руб, Кол-во, Сумма, руб., Сумма (без НДС), руб, Кол-во]
***************
time vadj=6911
Split string (Vadja) = [Сумма, руб., Сумма (без НДС), руб, Кол-во]
time tigralen=8413
Split string (tigralen) = [Сумма, руб., Сумма (без НДС), руб, Кол-во]
time vadj=16826
Split string (Vadja) = [Сумма, руб., Сумма (без НДС), руб, Кол-во, Сумма, руб., Сумма (без НДС), руб, Кол-во, Сумма, руб., Сумма (без НДС), руб, Кол-во, Сумма, руб., Сумма (без НДС), руб, Кол-во]
time tigralen=11418
Split string (tigralen) = [Сумма, руб., Сумма (без НДС), руб, Кол-во, Сумма, руб., Сумма (без НДС), руб, Кол-во, Сумма, руб., Сумма (без НДС), руб, Кол-во, Сумма, руб., Сумма (без НДС), руб, Кол-во]


...
Рейтинг: 0 / 0
Разбивка на слова
    #39655950
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяно тут разница приличная"Меня опять терзают смутные сомнения", что "приличную разницу" даёт компиляция регулярного выражения ...
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655952
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov"Меня опять терзают смутные сомнения", что "приличную разницу" даёт компиляция регулярного выражения ...
вроде она вынесена за интервал измерения
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655961
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадявроде она вынесена за интервал измеренияДело даже не в этом ...
Test.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
import java.util.*;
import java.util.regex.*;
import java.util.stream.*;

public class Test
{
  private static final Pattern QUOTE_WITH_COMMA = Pattern.compile("\", \"");

  public static void main(String args[])
  {
    String text = "\"Сумма, руб.\", \"Сумма (без НДС), руб\", \"Кол-во\"";
    System.out.println("Source: " + text);

    List<String> result;
    result = Arrays.asList( text.replace("\", ", "\"@").split("@") );
    result = QUOTE_WITH_COMMA
      .splitAsStream(text.replaceFirst("^\"", "")
      .replaceFirst("\"$", ""))
      .collect(Collectors.toList());

    long s = System.nanoTime();
    result = Arrays.asList( text.replace("\", ", "\"@").split("@") );
    System.out.println((System.nanoTime() - s) + ": by replace = " + result);

    s = System.nanoTime();
    result = QUOTE_WITH_COMMA
      .splitAsStream(text.replaceFirst("^\"", "")
      .replaceFirst("\"$", ""))
      .collect(Collectors.toList());
    System.out.println((System.nanoTime() - s) + ": by regex = " + result);
  }
}

Код: plaintext
1.
2.
Source: "Сумма, руб.", "Сумма (без НДС), руб", "Кол-во"
67069: by replace = ["Сумма, руб.", "Сумма (без НДС), руб", "Кол-во"]
172233: by regex = [Сумма, руб., Сумма (без НДС), руб, Кол-во]

Разница, примерно, трёхкратная, а совсем не два порядка.
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655991
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и для сравнения:
Test.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
import java.util.*;
import java.util.regex.*;
import java.util.stream.*;

public class Test
{
  private static final Pattern QUOTE_WITH_COMMA = Pattern.compile("\",\\s*\"");

  public static void main(String args[])
  {
    String text = "\"Сумма,руб.\",  \"Сумма (без НДС),руб\", \t\"Кол-во\"";
    System.out.println("Source: " + text);

    List<String> result;
    result = Arrays.asList( text.replace("\", ", "\"@").split("@") );
    result = QUOTE_WITH_COMMA
      .splitAsStream(text.replaceFirst("^\"", "")
      .replaceFirst("\"$", ""))
      .collect(Collectors.toList());

    long s = System.nanoTime();
    result = Arrays.asList( text.replace("\", ", "\"@").split("@") );
    System.out.println((System.nanoTime() - s) + ": by replace = " + result);

    s = System.nanoTime();
    result = QUOTE_WITH_COMMA
      .splitAsStream(text.replaceFirst("^\"", "")
      .replaceFirst("\"$", ""))
      .collect(Collectors.toList());
    System.out.println((System.nanoTime() - s) + ": by regex = " + result);
  }
}

Код: plaintext
1.
2.
Source: "Сумма,руб.",  "Сумма (без НДС),руб",   "Кол-во"
63045: by replace = ["Сумма,руб.",  "Сумма (без НДС),руб",      "Кол-во"]
150235: by regex = [Сумма,руб., Сумма (без НДС),руб, Кол-во]
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655992
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,
скорее всего разница не только в этом . я формирую массив, а ты лист.
для правомерности сравнения надо сдела приведение и так и так.
первоначально я стремился ускорить не только сплитом.
заменю массив на лист для чистоты.
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655999
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, дык, чтобы было сравнимо, я и собрал массив в список.
подальше положишь - поближе возьмёшь
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class Test
{
  private static final Pattern QUOTE_WITH_COMMA = Pattern.compile("\",\\s*\"?");

  public static void main(String args[])
  {
    String text = "\"Сумма,руб.\",\"Сумма (без НДС),руб\",\t \"Кол-во\",";
    System.out.println("Source: " + text);

    List<String> result;
    result = Arrays.asList( text.replace("\", ", "\"@").split("@") );
    result = QUOTE_WITH_COMMA
      .splitAsStream(text.replaceFirst("^\"", "")
      .replaceFirst("\"$", ""))
      .collect(Collectors.toList());

    long s = System.nanoTime();
    result = Arrays.asList( text.replace("\", ", "\"@").split("@") );
    System.out.println((System.nanoTime() - s) + ": by replace = " + result + "(" + result.size() + ")");

    s = System.nanoTime();
    result = QUOTE_WITH_COMMA
      .splitAsStream(text.replaceFirst("^\"", "")
      .replaceFirst("\"$", ""))
      .collect(Collectors.toList());
    System.out.println((System.nanoTime() - s) + ": by regex = " + result + "(" + result.size() + ")");
  }
}

Код: plaintext
1.
2.
Source: "Сумма,руб.","Сумма (без НДС),руб",      "Кол-во",
33535: by replace = ["Сумма,руб.","Сумма (без НДС),руб",         "Кол-во",](1)
166063: by regex = [Сумма,руб., Сумма (без НДС),руб, Кол-во](3)
...
Рейтинг: 0 / 0
Разбивка на слова
    #39656002
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще: нужен велосипед - загляни в Apache Commons CSV
...
Рейтинг: 0 / 0
Разбивка на слова
    #39656007
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Типа такого. Только у меня вертикальная палочка - делиметер. А в топике - будет запятая.


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
        String src = "/sqlite/northwind-SQLite3/OrderDetails.csv";

        CSVParser parser = CSVParser.parse(new FileReader(src),
                CSVFormat.newFormat('|')
                        .withSkipHeaderRecord()
                        .withFirstRecordAsHeader());

        Iterator<CSVRecord> iterator = parser.iterator();

        int cnt = 0;

        while (iterator.hasNext()) {
            CSVRecord rec = iterator.next();

            logger.info("Detected record = {}",rec.toMap());
...
Рейтинг: 0 / 0
Разбивка на слова
    #39656014
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
public class Split {

        public static void main(String args[]) {
            long total = 0;
            for(int j = 0; j < 500000; j++) {
                long s = System.nanoTime();
                String text = "\"Сумма, руб.\", \"Сумма (без НДС), руб\", \"Кол-во\" o\", \"";
                List<String> result = new ArrayList<>();

                // x3:
                int beg = 0;
                char prev = 0;
                char prevprev = 0;
                int i = 0;
                while(true) {
                    if(i == text.length()) {
                        if(++beg != text.length()) {
                            result.add(text.substring(beg, text.length()));
                        }
                        break;
                    }
                    char curr = text.charAt(i);
                    if(curr == '\"'
                            && prev == ' '
                            && prevprev == ',') {
                        result.add(text.substring(beg, i - 2));
                        beg = i;
                    }
                    prevprev = prev;
                    prev = curr;
                    i++;
                }

                total += System.nanoTime() - s;
                result.clear();
            }
            System.out.println("x3: " + total/500000);

            total = 0;
            for(int j = 0; j < 500000; j++) {
                long s = System.nanoTime();
                String text = "\"Сумма, руб.\", \"Сумма (без НДС), руб\", \"Кол-во\" o\", \"";
                List<String> result = new ArrayList<>();

                //SUBSTRING:
                int savedIndex = 1;
                int f = text.length() - 4;
                for (int index = 0; index < f; ++index) {
                    if (text.substring(index, index + 4).equals("\", \"")) {
                        result.add(text.substring(savedIndex, index));
                        index += 4;
                        savedIndex = index;
                    }
                }
                result.add(text.substring(savedIndex, text.length() - 1));
                total += System.nanoTime() - s;
                result.clear();
            }
            System.out.println("SUBSTRING: " + total/500000);
        }
}


авторx3: 360
SUBSTRING: 955
...
Рейтинг: 0 / 0
Разбивка на слова
    #39656065
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
public class Split {

    public static void main(String args[]) {
        long total = 0;

        for (int j = 0; j < 500000; j++) {
            long s = System.nanoTime();
            String text = "\"Сумма, руб.\", \"Сумма (без НДС), руб\", \"Кол-во\" ";
            List<String> result = new ArrayList<>();

            //SUBSTRING:
            int savedIndex = 1;
            int f = text.length() - 4;
            for (int index = 0; index++ < f;) {

                if (text.charAt(index) == '\"' && text.charAt(++index) == ',' && text.charAt(++index) == ' ' && text.charAt(++index) == '\"') {
                    result.add(text.substring(savedIndex, index - 4));
                    savedIndex = index;
                }
            }
            result.add(text.substring(savedIndex, text.length() - 1));
            total += System.nanoTime() - s;
            result.clear();
        }
        System.out.println("SUBSTRING: " + total / 500000);
        total = 0;

        for (int j = 0; j < 500000; j++) {
            long s = System.nanoTime();
            String text = "\"Сумма, руб.\", \"Сумма (без НДС), руб\", \"Кол-во\"";
            List<String> result = new ArrayList<>();

            // x3:
            int beg = 0;
            char prev = 0;
            char prevprev = 0;
            int i = 0;
            int tl = text.length();
            while (true) {
                if (i == tl) {
                    if (++beg != tl) {
                        result.add(text.substring(beg, tl));
                    }
                    break;
                }
                char curr = text.charAt(i);
                if (curr == '\"'
                        && prev == ' '
                        && prevprev == ',') {
                    result.add(text.substring(beg, i - 2));
                    beg = i;
                }
                prevprev = prev;
                prev = curr;
                i++;
            }

            total += System.nanoTime() - s;
            result.clear();
        }
        System.out.println("x3: " + total / 500000);

    }
}



SUBSTRING: 524
x3: 865

equals = тормоз
...
Рейтинг: 0 / 0
Разбивка на слова
    #39656072
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поправка
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
for (int j = 0; j < 500000; j++) {
            long s = System.nanoTime();
            String text = "\"Сумма, руб.\", \"Сумма (без НДС), руб\", \"Кол-во\"";
            List<String> result = new ArrayList<>();

            //SUBSTRING:
            int savedIndex = 0;
            int f = text.length() -4;
            for (int index = 0; index < f;index++) {

                if (text.charAt(index) == '\"' && text.charAt(++index) == ',' && text.charAt(++index) == ' ' && text.charAt(++index) == '\"') {
                    result.add(text.substring(savedIndex, index - 2));
                    savedIndex = index-1;
                }
            }
            result.add(text.substring(savedIndex, text.length() ));
            total += System.nanoTime() - s;
            result.clear();
        }
...
Рейтинг: 0 / 0
Разбивка на слова
    #39656080
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторx3: 271
SUBSTRING NO EQUALS: 154

Ты выиграл) Поизаимствовав мои идеи))
Я думал доп переменные будут быстрее проверок которые есть в charAt(), ан нет.
...
Рейтинг: 0 / 0
Разбивка на слова
    #39656091
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892авторx3: 271
SUBSTRING NO EQUALS: 154

Ты выиграл) Поизаимствовав мои идеи))
Я думал доп переменные будут быстрее проверок которые есть в charAt(), ан нет.
меня смутило твоё использование substring 2 раза при уаеличении скорости.,...
...
Рейтинг: 0 / 0
17 сообщений из 42, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Разбивка на слова
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]