- 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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main(){
setbuf(stdout,NULL); //disable output buffering
char *str=malloc(8);
strcpy(str,"abcdefgh");
str=realloc(str,strlen(str)+8);
strcat(str,"efghefgh"); //sprintf(str,"%s%s",str,"efghefgh");
int imax=1024/strlen(str)*1024*4;
printf("%s","exec.tm.sec\tstr.length\n"); //fflush(stdout);
time_t starttime=time(NULL);
char *gstr=malloc(0);
int i=0;
char *pos;
int lngth;
char *pos_c=gstr;
int str_len=strlen(str);
while(i++ < imax+1000){
lngth=strlen(str)*i;
gstr=realloc(gstr,lngth+str_len);
strcat(gstr,str); //sprintf(gstr,"%s%s",gstr,str);
pos_c+=str_len;
pos=gstr;
while(pos=strstr(pos,"efgh")){
memcpy(pos,"____",4);
}
if(lngth % (1024*256)==0){
printf("%dsec\t\t%dkb\n",time(NULL)-starttime,lngth/1024); //fflush(stdout);
}
}
//printf("%s\n",gstr);
}
http://raid6.com.au/~onlyjob/posts/arena/ - банальый пример бенчмарков всяких недоЯП. Это новый топ10 шедевр на этот месяц.
Именно про такие бенчи кукарекают питушки, когда ссылаются на какие-то бенчи - самое смешно в этом то, что %подставить имя ЯП% сравнивать с сишкой бесполезно, ибо их стдлиб написана на Си и дрёглает либц. Т.е. сравнивая стдлиб разных ЯП - вы сравниваете сишные реализации и оверхеды самих ЯП.
И в жаве, и в пхп, и в руби, и в сишарпе, и в плюсах и в перле и в питоне.
Форт написан на сишке, это как сишный препроцессор. В нём тупо нет стдлиб, а код гинерится гинератором на сишке. Мы говорим про софтварные реализации.
Поэтому в 100% случаев ты мериешь не производительность своего языка - а качество написания на сишке стдлиба и оверхеда твоего ЯП. Смысла сравнивать это с сишкой нет, ибо сишка в любом случае либо в хлам уделает, либо даст такой же перфоманс(шанс на это предельно мал). Ты согласен?
Обычно язык мериют именно производительность конструкций, вкоторых не учавствует стдлиб - тогда уже мы получаем реальный перфоманс ЯП, а не скорость вызовов сишного кода, который к ЯП никакого отношения не имеет.
Работает это лишь потому, что на этих ЯП выполняют примитивные операции - аля парсинг строк и код 95% выполняет Сишный уровень. Чем сложнее проект - тем больше в программе времени занимает исполнение твоего кода - и тут уже проявляется реальная производительность ЯП.
Надо понять, что это совершенно разные вещи, который лишь в паре областей пересекаются из-за способов юза ЯП.
Остаются языки, у которых есть свой кодогенератор. Я допускаю, что они могут проиграть gcc, потому что у них может не оказаться такого понтового оптимизатора, но для уверенности нужно сравнить.
Что-за питушня. Где эффективный царский аллокатор? С такими методами твой код сольет сраной жабе с ее StringBuilder'ом.
а чем он ТАК плох?
Она а не он. StringBuilder тут наоборот выставляется в хорошем свете, в противовес realloc'у. А жаба с точки зрения Царя - говно для заедушных анскилябр.
хотя бы за
int a[]=new int[1]; a[0]=0;
List b=new Vector();b.add(0);
ну вы поняли.
Да уж, ref бы ей точно не повредил, а то эти массивы из 1 элемента абузят для выходных параметров ;)
вон в сирешетке же можно писать что-то вроде this.eventListener+=new MyListener(); а в жабе надо обязательно this.addEventListener(new MyEventListener()); и никак иначе
http://pastebin.com/ikhQrbvJ - царский вариант, который я сваял на коленке. Я даже его не оптимизировал. Я тут даже в вектор-стайле питух-реалок заюзал, чтобы питушки на 32битных питухах и включенным оверкоммитом не кукарекали на мои маллоки на 100гигобайт.
А жаба сливает прежде всего из-за gstr += str. Эта питушня ей сборщик мусора с резьбы срывает.
Правда это константу никто не учитывает, для сишки она может быть 100тактов, а для жавы 100кк, но кого это волнует.
Вот тебе пример, банальный пример. Братуха запускает этот код у себя на хасвеле - и бам - он в 5раз медленее, чем у меня на коре2. В чём же проблема? Отгадай?
В глибц есть 2 реализации strstr() - одна на memchr() - а он через sse2, другая на sse4.2. Вторая работает быстрее первой на много, если строка нормальная.
В данной задаче строка даже не влезает полностью в sse-регист, никакого выравнивания нет и прочего. Поэтому на этой маленькой строчке в 10байт, первый вариант ищет в овер3раза быстрее, чем 2-й.
Почему так происходит? Ибо это писали такие же питухи, которые не понимают для чего нужна strstr(), как она работает - и получают говно.
Этот коэффициент, питушок, важен в любых близких классах. Так же, важно самое n. Поэтому норальные пацаны берут константное n, берут константный коэффициент - и считают. А питухи кукарекают про O(n^2).
95% нормальных алгоритмов в вашей питу-теоретике - есть близкие классы, а все ваши питушарские аргументы работают только на брутфорс-сортировке и n ~= inf.
В этом ваша бида, ибо сам результат функции - это самое легкоподсчитываемое и примитивное значение, а вот n и коэффициент посчитать питухам не дано, поэто онатация говно.
вот O(lg(n)) и O(ln(n)) складывать можно
Волнует тех, кто доучил теорию сложности до конца, а не только до O(n)... В том же gmp, к примеру, некоторые извратные алгоритмы умножения включаются, емнип, в районе 1000-2000 знаков, т.к. только тогда они перебивают более простые. Т.е. кому надо - тот учитывает.
Реальный же человек сводит истинное, глубинное понимание к примитивным абстракциям. А ты, животное, пытаешься им доказать, что телевизор - это твоей пульт. Пытаясь свести разницу в каналах к "еденичке и двоечке" на кнопочках.
Наверное надо приводить примеры как ты.
Вы бесполезные питушки, которые пользуются тем, что пилят вменяемые люди. И вместо того, чтобы благодарить их, что вы, бездари, можете за их счёт нихрена не делать и не думать - вы кукарекаете.
> кукарекушка
Говорит тебе, хуй изо рта вынь, а то кукареку да кукареку вместо человеческой речи выходит.
Итак, повторю вопросы: Где используется gmp, кроме modexp в криптографии с открытым ключом? Нахрена он мне сдался?
Оптимизации чисел в конпеляторе - без гмп код 10/3 у тебявыполнялся бы в 20раз медленнее.
Ты обычный питух, который несёт херню, не понимания чиго он несёт вообще.
Да, конкретно тебе для накидывания кнопочек на формачку это не нужно, но анскильная питушара, которая бесполезна в этом мире.
И далеко не везде используется gmp вообще, в яве свой код.
>Оптимизации чисел в конпеляторе - без гмп код 10/3 у тебявыполнялся бы в 20раз медленнее.
Для деления двух чисел используется gmp?
>бесполезна в этом мире.
Царь, бесполезны в этом мире люди, которые забивают гвозди микроскопом. Которые решают прикладные задачи языками для системного программирования без стандартной библиотеки. Если еще не понял - речь о тебе. А теперь поднялся и побежал нахуй, пидорва.
Это что еще за питушня? Где кастомный Царский аллокатор, оптимизированный под эту ситуацию? Даже сраная жаба с ее StringBuilder'ом будет работать быстрее...
Т.е. у него максимум мог падать фри на значениях больше 24бит, но тупо падть как он описал - она не может.
На 32-битке при выравнивании 8, и на 64-битке при выравании на 16 - не крашнется, т.к. за выделенным блоком будут торчать 4/8 байт, подравнивающие следующий блок.
P.S. Ну или у него какая-нибудь херня для защиты кучи включена. В вижуалке вроде было нечто подобное.
Ну и для сравнения нестандартные компиляторы. В питушиной Watcom C программа работает (после адаптации исходника: он требует, чтобы переменные объявлялись только в начале блоков). Борман С и ненавистная вижуалка валятся сразу (они, кстати, требуют такой же адаптации а-ля Алгол).
И покажи нам выхлоп, не должно поидее такого быть.
00292FB0
00292FD0
Разница 32.
А если вывод перенаправить в файл, то почему-то выдаёт чушь типа
003C2FC8
003C0E70
Т. е. второй указатель меньше первого и выравнивание хромает.
Тут скорее всего 16байтный блок и 8байтное выравнивание, поэтому странно, что оно крашится. Сделай fprintf(stdout, "%lx\n%lx\n", *((uint64_t *)p1 - 1), *((uint64_t *)p1 - 2)); Первая строчка должна быть не нулевой.
Тогда *p1 = 00342fd0 (т . е. замусорено адресом следующего блока),
*(p1 + 1) = 003400c4
*(p1 + 2) = 27debca7
*(p1 - 1) = 0f00a9aa
*(p1 - 2) = 27debca7
P.S. А в Ideone все нули, кроме *(p1 - 1) = 00000011.
*(p1 + 1) — указатель на первый блок кучи(?),
*(p1 + 2) == *(p1 - 2) — какая-то сигнатура (контрольная сумма?),
*(p1 - 1) — что то хитрое, но непосредственно перед блоком идут байты 00, 0f.
Поэтому твои p1+n - это твоя память, доступная тебе.
8байт до твоего указателя - это служебная инфа, поидее там должен быть какой-то инод, но как там запиленно - я уже не помню, да и мне лень даже глядеть код этой питушни.
Возможно это длинна куска, который выделил тебе маллок, либо ит о и другое.
Если там у тебя реально 7нулей и 0f, то это длинна твоего блока в байтах - поменяй 2-й аргумент маллока на 32, 48, 64 байта - погляди.
Оказывается, что в разных реализациях всё по-разному. В Ideone перед блоком в 32-битном числе хранится его размер, перед размером 32-битное число, равное нулю, а дальше сканировать память Ideone не позволяет — срабатывает защита.
В mingw же перед блоком 16-битное (да!) число хранит не размер блока, а (вероятно) количество неиспользуемых байтов до следующего выравнивания. Перед этим числом 6 байт хранят неопознанную информацию (вероятно для защиты), а перед ними 4 нулевых байта.
> дальше сканировать память Ideone не позволяет — срабатывает защита
Вылезаешь за начало кучи ;)
Ну походу действительно защита стека.
0chan.hk/c/ , где с - царь
будуар obvious fix
Делаю минеты
Во-первых, в яве многое написано на яве же. А так- все правильно, зачем писать на говноязыке 30-летней давности, когда можно писать на удобных современных языках со сборкой мусора, а скорость будет почти той же?
Т.е. твой жаба-аллокатор - это аллокатор над Си-аллоктором, который по определению быстрее быть не может.
жабий аллокатор до поры до времени не удаляет ничего, потому не теряет времени на честную деструкцию мелких объектов
поэтому отъедает дохуя
а потом решает, что метров 200 занимают мертвые объекты сплошняком, и быстро их пачкой чистит
потому некоторые бенчи даже могут показать неплохой жабий "перформанс" по сравнению с сишкой
главное, успеть остановить бенч, пока сборщик мусора не включился
в сишке нет конструкторов и ты сам себе таджик
инфа 100% например
если бы не удалял старый кусок, который не может расти, а в 2 вызова бы работал - легко бы запилился и с перемещением классов
особенно с наличием мув-конструкторов
но а так там беда с кроссплатформенностью - везде свой говнокод для эмуляции реаллока
вот если бы сделали реалок, который возвращает нуль, если расширить область нельзя или хендл для последующего подтверждения расширения, если расширить можно. (притом хендл желательно в раии)
Еще этого не хватало :) И так уже туева хуча спецконструкторов...
Не совсем. В жабе же нет такого понятия как free/delete. Там, емнип, в первом поколении копирующий GC, который спасает нужные объекты, а на остальные просто забивает хуй, сбрасывая указатель аллокатора на начало кучи. Время сборки первого поколения зависит от числа нужных объектов, и никак не зависит от числа выделенных с момента предыдущей сборки. Вот следующие поколения, там да, там дольше перекапывать...
Поэтому на некоторых сценариях жабий аллокатор может быть быстрее. Но с другой стороны такие сценарии на сишке никто использовать и не будет (выделять память мелкими кусками, почти сразу освобождая их).
На тухлой конденсаторной памятиты ты этого не получишь, хоть 100500 раз запили хардварно.
Посчитай сколько будет стоить такая память и шина для неё. Для сишки хватит ручного л2 на метров 50, и сишка будет рвать в хлам всё на 97% задач. Это реально.
Гигабайт автоматического л2 уже не реально, а на жаве с меньшим л2 ты не пролучишь профит.
Хотя возможно и 30к - покажи мне, какую ты нашел за 30к.
стоимость также умнож на 10 и получишь стоимость срам
то что срам ещё не производят в больших количествах в качестве рам - это срам
А ммап() жаба юзает, а ммап - это сишный аллокатор.
Вы постоянно путаете Си и либси. Си самодостаточный ЯП, который может сам рулить кучей как угодно, а жаба и остальные недоЯП не могут. Поэтому Си рвёт в хлам любую хреновину.
И да, жабааллокатор написан на Си, и это не жабааллокатор, а Си-аллокатор.
насчет дефрагментации памяти - вряд ли, все упирается в ленивость жабамусоросборщика, котторый вызывается когда рак на горе свистнет
Это вызывает лютый бугурт у пользователей, и порождает утверждение, что жаба всегда занимает 8 гигабайт
Но ведь через час-два работы, когда гц хорошенько всё засрёт, она реально занимает 8 гигабайт... Или нет?
GC ленив, и пока место не кончится, говно и правда будет лежать в памяти. Просто так от нечего делать он ничего не чистит
Ось все таки выгрузит говно в свап, оно там не будет никому мешать, хотя конечно засрет место в свапе и в таблицах страниц и в соответствубщих структурах ядра
Я уже 10раз описывал как.
Что ты пездишь, пидорва?
И ленивая подгрузка страниц, префаулт, madvise() на линуксе есть - можно расцеплять странички. Иметь одни и те же адреса вечно, изменяя лишь связи с реальными. Это в бесконечное число раз быстрее любого софтварного аллокатора, ибо любой софтварный аллокатор это же и делает, но имеет оверхед намного больше, чем операции связывания в ведре.
У тебя итак будет оверхед минимум страница на каждую твою структуру памяти, только вот на маллоке у тебя ещё будет тотальная дефрагментация и уменьшить кучу почти нереально. Именно поэтому питух-блоузеры и не могут нормально освобождать память, ибо их куча говно.
Поэтому реально, в обычном коде оверхед от маллока настолько огромен, что просто не сравним с оверхедом на том, что я описал.
Так у участников спора больше свободы, и каждый может выбрать свои аргументы\контаргументы, а не юзать заданные инициатором.
Тут все по команде готовы начать грызтся, причем каждый понимает сказанное по-своему и искренне счиатет остальных полудурками. Идеальное пастбище для троллей.
А круг является множеством точек (=^ ◡ ^=)
Круг — часть плоскости, которая лежит внутри окружности. Другими словами, это геометрическое место точек плоскости, расстояние от которых до заданной точки, называемой центром круга, не превышает заданного неотрицательного числа R. R называется радиусом этого круга. Если радиус равен нулю, то круг вырождается в точку.
пиздеж, точка - это ромб с диагональю 0
Особенно если это один человек.