- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;
import static java.lang.System.*;
import static java.util.concurrent.TimeUnit.NANOSECONDS;
public class Rep implements CharSequence
{
String str = null;
int len;
char base;
public Rep(char x, int count)
{
this.len = count;
this.base = x;
}
@Override
public int length()
{
return len;
}
@Override
public char charAt(int index)
{
return base;
}
@Override
public CharSequence subSequence(int beginIndex, int endIndex)
{
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
if (endIndex > this.len) {
throw new StringIndexOutOfBoundsException(endIndex);
}
int subLen = endIndex - beginIndex;
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
return ((beginIndex == 0) && (endIndex == this.len)) ? this
: new Rep(this.base, subLen);
}
@Override
public String toString()
{
return null!=str ? str : (this.str = new String(new char[]{base}).repeat(len));
}
public static void main(String... args)
{
long ns = 0L;
Pattern lazy = Pattern.compile("^(11+?)\\1+$");
Pattern greedy = Pattern.compile("^(11+?)\\1+$");
ns=nanoTime(); lazy .matcher(new Rep('1',100160079)).matches(); out.println( NANOSECONDS.toMillis(nanoTime()-ns));
ns=nanoTime(); greedy.matcher(new Rep('1',100160079)).matches();out.println( NANOSECONDS.toMillis(nanoTime()-ns));
ns=nanoTime(); greedy.matcher(new Rep('1',1165139)).matches();out.println( NANOSECONDS.toMillis(nanoTime()-ns));
ns=nanoTime(); "1".repeat( 100160079 ).matches("^(11+?)\\1+$") ; out.println("Lazy String:"+ NANOSECONDS.toMillis(nanoTime()-ns));
ns=nanoTime(); "1".repeat( 100160079 ).matches("^(11+)\\1+$") ; out.println("Greedy String:"+ NANOSECONDS.toMillis(nanoTime()-ns));
}
}
Так как в «Йажа» регулярки работают не на строках, а на интерфейсе CharSequence https://docs.oracle.com/javase/8/docs/api/index.html?java/lang/CharSequence.html
Решил что можно сделать тупую реализацию CharSequence для строк из повторяющегося символа.
https://ideone.com/8eYFU7
3.14159265 16.07.2020 13:42 # 0
Fike 16.07.2020 14:30 # 0
ну кто ж так бенчит? создание тестовых данных за пределы измеряемого времени-то вынеси
vistefan 16.07.2020 14:38 # +1
3.14159265 16.07.2020 15:08 # 0
3.14159265 16.07.2020 15:11 # 0
Впрочем заполнение строки питушнёй настолько несущественно, что разница там в пределах погрешности.
Стало даже чуть хуже
Lazy String : 1092
https://ideone.com/M6ZXhR
Fike 16.07.2020 19:43 # 0
это и близко не бенчмарк, какая-то хуйня внутри происходит, ну да и ладно.
gost 16.07.2020 19:53 # 0
Fike 16.07.2020 20:03 # 0
gost 16.07.2020 20:06 # +1
Fike 16.07.2020 20:09 # 0
мало того, что жажа уже при стартапе загружает кучу всего, так и внутри вызова может наткнуться на какой-то незагруженный класс и пойти читать с диска
gost 16.07.2020 20:11 # +2
Fike 16.07.2020 20:14 # 0
да, реальная задача
gost 16.07.2020 20:16 # 0
И да, копирование картинок в буфер обмена в винде — это ёбанное днище.
TEH3OPHblu_nemyx 16.07.2020 20:54 # +1
vistefan 16.07.2020 20:57 # 0
Лоооооол
Виндобляди соснули
vistefan 16.07.2020 20:58 # +4
3.14159265 17.07.2020 00:31 # 0
У себя я бенчил из jshella.
Со стартованной йажей и загруженными классами.
guest8 17.07.2020 00:35 # −999
3.14159265 17.07.2020 00:41 # 0
Я не хочу пирдолиться чтобы создать тепличные условия сраной Йаже, которой в отличие от быстрой однострочной скриптухи (!) нужен ещё какой-то пирдолинг с «питухвм», и КОКОКОмпилятором.
И всё ради того чтобы выиграть жалкие 3 секунды. Чтобы Йажа соснула не за 1410 секунд, а всего за 1407.
Надо не питухвмы городить, а делать оптимизированный зожимающий repeat, который не засирает мегабайты памяти.
gost 17.07.2020 00:43 # +1
Подтверждаю. Скриптуху вообще time'ом измеряли, со всеми накладными расходами на запуск процесса и безо всяких прогревов.
3.14159265 16.07.2020 15:16 # 0
А она всё-равно пёрлу сливает
Fike 16.07.2020 19:48 # 0
> Complex regular subexpression recursion limit (32766) exceeded at -e line 1.
ты exit code-то хоть проверял?
gost 16.07.2020 19:54 # 0
Fike 16.07.2020 20:03 # 0
gost 16.07.2020 20:05 # +1
Результаты он выдаёт полностью корректные, так что действительно плевать.
Fike 16.07.2020 20:06 # 0
> Complex regular subexpression recursion limit (32766) exceeded at -e line 1.
Fike 16.07.2020 20:07 # 0
gost 16.07.2020 20:08 # +1
Fike 16.07.2020 20:12 # 0
> Кстати, я придумал тебе число, на котором пёрл сольётся как лалка и выдаст неправильный ответ.
ну то есть опять приходим к тому, что жажа выолняет одно, а пердл другое
gost 16.07.2020 20:15 # 0
> ну то есть опять приходим к тому, что жажа выолняет одно, а пердл другое
Все языки выполняют разное, потому что у них у всех разные реализации движка рагулярных выражений.
Fike 16.07.2020 20:56 # +1
gost 16.07.2020 20:56 # 0
vistefan 16.07.2020 20:58 # 0
gostinho 17.07.2020 09:01 # 0
vistefan 16.07.2020 20:56 # +3
Fike 16.07.2020 22:32 # +2
TEH3OPHblu_nemyx 16.07.2020 22:33 # 0
gost 16.07.2020 22:35 # 0
gost 16.07.2020 22:36 # +1
Разве не красиво? И это я только два вида кавычек использовал!
MAKAKA 16.07.2020 22:48 # 0
gost 16.07.2020 23:25 # 0
Красиво. Всё таки «Руби» — очень сладкий язык.
gostinho 17.07.2020 00:33 # 0
gost 16.07.2020 22:35 # 0
3.14159265 17.07.2020 00:23 # 0
В каждом языке сделали специальный оператор/метод для повтора строки.
Есть перл, 1 x 75120045
Есть руби и питух "1" * 75120045
В йажа завезли "1".repeat( x ).
Но сделали анскильно.
В той же йажа строки немутабельные. То есть раз мы создали миллион "1" он таким навсегда и останется
Неужели действительно нельзя было сделать чтобы repeat возвращал простой CharSequence. Содержащий повторяемую строку и количество повторений.
И не плодить строки с гигабайтом повторяющихся символов?
Конкретно в этой задаче это дало ускорение 5-15 раз. И константу по памяти.
vistefan 17.07.2020 10:20 # 0
Или ты заставил регэкспы работать с каким нибудь потоком String и заимплементил интерфейс?
3.14159265 17.07.2020 11:59 # 0
Будет.
>Или ты заставил регэкспы работать с каким нибудь потоком String и заимплементил интерфейс?
Вообще-то пример кода в посте. https://govnokod.ru/26808
vistefan 17.07.2020 12:16 # 0
3.14159265 17.07.2020 12:17 # 0
В примере из поста toString вообще не вызывается. На что указывает маленькое количество памяти в тестах. Движок регэксов откусывает из последовательности по символу.
Т.к. код не лазит постоянно в память, а берёт символы из ближайшего кеша алгоритм ускоряется в 5-15 раз.
Такое встречается довольно часто. Иногда нужно сгенерить последовательность символов для итерации.
CharSequence можно представить как ленивый список из Хацкеля. Он в теории мог быть даже бесконечным, если бы не int length().
vistefan 17.07.2020 12:21 # 0
vistefan 17.07.2020 12:23 # 0
3.14159265 18.07.2020 16:16 # +2
3.14159265 18.07.2020 16:28 # +1
gost 18.07.2020 16:34 # +1
TEH3OPHblu_nemyx 18.07.2020 16:39 # 0
gost 18.07.2020 16:42 # 0
3.14159265 18.07.2020 18:04 # 0
>main[-1u]={1};
Сишка компактнее. И на мой вкус изящнее.
Путушное решение скучное.
А с main[] я вообще удивился что эта питушня компилится.
gost 18.07.2020 18:10 # 0
Плотность в гигабайтах на байт исходного кода всё равно выше.
> И на мой вкус изящнее.
А тут соглашусь, великолепный трюк.
3.14159265 18.07.2020 20:01 # 0
Какая разница сколько там воображаемых петабайт, если эта плотность недостижима на практике? Сишка практичнее.
Компиляцию Питуха невозможно проверить на практике, т.к. нет столько ОЗУ.
А когда столько ОЗУ и дискового пространства появится, то в Сишку просто завезут 128-битные типы и более широкую адресацию.
-1lu переполнится в ещё большие числа.
TEH3OPHblu_nemyx 18.07.2020 19:40 # +1
Выхлоп gcc -S a.c:
Выхлоп bcc32 -S a.c:
Выхлоп wcc386 a.c; wdis -a a.obj:
«Цифровой Марс» выдаёт то же, что и «Watcom».
«MSVC» генерирует аналогичную питушню, разве что вставляет комментарий:
Интеловский компилятор ведёт себя аналогично «MSVC».
Выхлоп lcc -S a.c:
Выхлоп clang -S a.c:
И даже «tcc» Фабриса Беллара генерирует такой же массив.
TEH3OPHblu_nemyx 18.07.2020 19:47 # +1
В «K&R C» был «автовывод» типов: все необъявленные скаляры считались типа int, у всех необъявленных массивов тип элемента был int, у всех необъявленных функций тип результата был int.
Поэтому pituh[-1u]={1}; эквивалентен int pituh[-1u]={1};
Т. е. объявляем массив интов, в квадратных скобках размер, в фигурных — начальные значения некоторого среза массива, начиная с нулевого элемента (всё, что явно не инициализировали в фигурных скобках, инициализируется нулём).
В сишке нельзя инициализировать массив частично: можно или вообще не инициализировать (тогда он не попадёт в экзешник, а будет создаваться при загрузке программы), либо инициализировать полностью (компилятор за нас запишет нули в элементы, которые мы пропустили).
main — это не конструкция языка, это всего лишь известный символ в стандартной библиотеке. Успешной линковки и отладки, когда код из CRT вызовет _main, а в нём массив, начинающийся с единички, вместо вменяемого кода.
TEH3OPHblu_nemyx 18.07.2020 20:08 # +1
main объявлен как массив из одного элемента со значением 0xc3 (что совпадает с опкодом RET у x86). Поскольку у x86 маленький индеец, 0xc3 будет самым первым байтом, а нули будут потом.
Может не сработать из-за DEP, если поддерживается атрибут NX.
3.14159265 18.07.2020 20:25 # +1
В целом, да. Можно написать в машинных кодах какие-то вычисления, переместить в rax и вывести их в консоль через код разврата.
TEH3OPHblu_nemyx 18.07.2020 20:31 # +1
В «MSVC», «Borland C», «Watcom C» нужно писать так:
Первая строка не нужна, потому что секция ".text" уже имеется. Эта строка нужна, чтобы заткнуть компилятор.
gost 18.07.2020 20:35 # 0
TEH3OPHblu_nemyx 18.07.2020 20:37 # +1
3.14159265 18.07.2020 21:00 # +1
Умножает argc на 3.
3.14159265 18.07.2020 20:58 # 0
А вообще реальные Цари не пишут main, а начинают программу переопределяя _start.
3.14159265 18.07.2020 21:10 # +1
Его нужно почистить, чтобы получить нулевой код разврата.
Но хорошо, что у Штеуд в 4 байта вмещается 2 инструкции благодаря variable length схеме.
И наконец-то мы получаем Success с нулём.
https://ideone.com/CCTOQT
TEH3OPHblu_nemyx 18.07.2020 16:35 # +1
gostinho 18.07.2020 16:46 # 0
3.14159265 17.07.2020 00:16 # 0
Не нужно хамить.
У приличных людей он в промпте автоматом выводится.
Кстати не понимаю почему это нигде не настроено по дефолту и в каждом дистре (даже где есть готовые презеты промпта) не настроено отображение кода и приходится его руками вписывать.
Мне код возврата в 90% гораздо важнее знать, чем текущую директорию, текущее время, юзера и прочую питушню.
guest8 17.07.2020 00:34 # −999
bormand 17.07.2020 01:47 # 0
Сишке же. Жаба честно регулярки считает, а пёрл всё сишке скармливает.
3.14159265 17.07.2020 12:02 # 0
ЧЯДНТ?
https://govnokod.ru/26800#comment559728
https://ideone.com/2MelzP
Her 16.07.2020 19:37 # +1
3.14159265 17.07.2020 00:27 # 0
Как ты эту сраную йажу не прогревай.
gostinho 17.07.2020 00:33 # 0
guest8 17.07.2020 00:34 # −999
gostinho 17.07.2020 00:36 # 0
MAKAKA 17.07.2020 03:47 # 0
да
gostinho 17.07.2020 08:58 # 0