- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
/* Copyright 2009 10gen Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* all the numbers that fit in a 4 byte string */
const char bson_numstrs[1000][4] = {
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
"10", "11", "12", "13", "14", "15", "16", "17", "18", "19",
/* 105 строк поскипано */
"980", "981", "982", "983", "984", "985", "986", "987", "988", "989",
"990", "991", "992", "993", "994", "995", "996", "997", "998", "999",
};
Взято отсюда - http://github.com/mongodb/mongo-c-driver/blob/master/src/numbers.c . А это коммит - http://github.com/mongodb/mongo-c-driver/commit/0198225180a51e0b0b8a84f25b34b3047d3b9c80
sprintf sucks. use lookup table for all nums < 1000
> sprintf sucks
так и есть, он медленный. вот мой велосипед:
эту строку на главную
wchar_t* ptr = buf + 15;
в данном контексте она займет достойное место среди самого отменного говнокода...
в данном контексте она займет достойное место среди самого отменного говнокода...
обоснуй.
капча 6666 подтверждает
некрасиво отмазки под гостем лепить...
не понял
я опять тебя не понял. что за хуйню ты порешь?
ассерты в не публичных функциях - для лосей типа с++ников или пхпистов.
написано - только 16 байтов, значит столько. если какое другое число - то ты говнокодер, трепло и хуйло, а не программист, выеби себя в жопу и сдохни.
документацию никто никогда не читает, если у кого-то возникает задача то он спросит о коллег и те расскажут что видели такую функцию, человек ее использует (интелисенс еще и подскажет что подсовывать) у него получается, он радуется, рапортует о завершении своего таска и тут начинаются никому непонятные глюки...
ну всё понятно, ты бы так сразу и сказал, что ты тупая обезьянка из быдлоконторы.
_cfint_ToWBuffer - это, повторяю для макак 10-ый раз, внутренняя функция модуля, она юзается только изнутри модуля и к ней имеют доступ разработчики модуля, она юзается в единичеых местах, а к разработке самого ядра всей моей заманухи долбоёбов, не читающих документации и пишущих код тыкая пальцем в небо я на йоту не подпущу.
это страхи быдлообезьянки среднего звена - лёгкая заменяемость одной на другую. у меня такого страха нет. А знаешь почему? )
тебя же не уволят, из-за того что в этом говне можешь ковыряться только ты...
> человек ее использует (интелисенс еще и подскажет что подсовывать)
уахаха, это вы в своей конторке ТАК пишете код? да ты ещё забавнее, чем я думал.
все эти ассерты они по незнанию, неуверенности, отсутствию внимания и ума. т.е. как раз для с++ников и шарпистов всяких, которые уже садятся писать код, не имея никакого представления, с какой библиотекой работают. и это их не спасает, и всё роавно у них постоянно всё падает.
код должен сам искать в себе ошибки, и именно такой код экономически эффективен...
пиздец, я тебе уже 20-ый повторю, наверное... в дельфи есть такое понятие, как nested-функции. твоя тупая головушка, надеюсь згнает, что это? так вот, __cfint_ToWBuffer - это nested-функция функции cfint_ToString. С какого хуя я должен тыщу раз перепроверять данные внутри одной (над)функции? я же не какой-нибудь ебанутый на всю голову с++ник.
ты неправ очень сильно. говнокод пишется говнокодерами. ассерты - шаг не к отсутствию говнокода, а шаг к сдерживанию говнокодеров (fool-proof code).
вместо того, чтобы сдерживать говнокодеров, лучше бы их просто не допускать за милю.
что касается ошибок по невниманию - то они случаются у жалких людишек всегда, в независимости от сдерживающих мер, которые, например, сами могут быть говнокодом, например, давеча в одной игрушке в одной локации происходил креш... с ассертом. Уже в продакшене. Стало быть, сдерживающие меры тоже нужно защищать? А сдерживающие меры сдерживающих мер? И так до бесконечности? А не проще ли тупо всё семь раз перепроверить? А? Глупые обезьяны.
прежде чем запретить говнокодерам писать говнокод, спроси себя, а не гавно, ли твой код... и всегда найдется тот кто скажет и докажет что говно...
я против проверок на каждом шагу, против паранойи.
конвенция уменя такая, что _публичные_ функции обязательно проверяют аргументы функций на валидность, кидается исключение обязательное.
но _вспомогательные_, _приватные_ функции могут без этого обходиться, ибо контекст использования кристально ясен (иначе какого хуя ты трогаешь код функции?). зачастую. иногда конечно бывает что и у аргументы приватных функций надо валидировать.
You shouldn't make mistakes anyway, it is a waste of time. We
don't want to hear anything about debuggers, we're not interested.
See figure 1.
в том-то и дело, что здесь нет ни говна, ни проблемы, а аргументы ты как настоящий пришибленный фанатик "неговна" игнорируешь. и как с++ников после этого уважать?
вот цитата из поста ниже:
> на гото, которое я случайно оставил в коде
человеку свойственно ошибаться, но некоторые люди перестраховываются... ассерт - один из методов подстраховки...
хехе, или ты олень, или я гений, но я ошибки вылавливаю за пару минут. в основном стоит закрыть глаза и прокрутить в голове код (который я знаю досконально наизусть). отладчиком вообще редко пользуюсь, ошибки легко находятся просто если проанализировать поведение в уме. и, как я уже говорил двадцать раз, та функция является семантически nested, а потому валидировать буфер внутри одной и той же сущности является признаком ебаната.
ситуации которые я описал вполне реальны...
ну да, хелловорлды тока и пишу.
> очень много времени
не, я просто не умею страдать хуйнёй - кодю постоянно. аутист как бы...
> и очень высокое ЧСВ...
да не, я обычный кусок бесформенного говна.
у тебя вот текущий проект сколько ЦЛОК?
http://govnokod.ru/1766
У меня в проекте строк больше, чем у тебя в 10 раз!
у меня ещё есть обратная функция, работает быстрее atoi.
1) эта функция - реплика классического примера из Kernighan и Ritchie's The C Programming Language, только там два старых мудня хуячат вперёд по массиву, а потом по всему массиву делают reverse, а у меня сразу хуячится в обратном порядке.
2) на гото, которое я случайно оставил в коде, ты обратил внимание (на это способен последний пхпшник), а на то, что функция неправильно работает с -2147483648, ты не заметил.
Это даёт мне основания считать, что ты говнокодер, трепло и хуйло.
надо спокойнее относиться к своему говнецу... насрал - буть добр признаться, а не обвиняй весь мир что у них еще хуже...
лось,
1) ты можешь уже понять, что __cfint_ToWBuffer используется ещё в паре других мест, где копирования нет
2) ты можешь уже понять, что я работаю с wchar_t'ами, ты мне предлагаешь копировать wchar_t-буфер в char-буфер, применять sprintf/непортабельный itoa (которые хуй знает сколько ещё раз чего копируют), а затем снова копировать char-буфер в wchar_t-буфер?
Да ты просто олигофрен.
TOP8 (под виндой с gnu stdlib)
8,1 сек -- __cfint_ToWBuffer/-O3
16,4 сек -- _wtoi (у которого мегатраблы с портабельностью)
16,7 сек -- нечестный itoa (у которого траблы с портабельностью), только char
17,7 сек -- __cfint_ToWBuffer/-O1
22,2 сек -- честный itoa (у которого траблы с портабельностью), с конв. char > wchar_t
52,4 сек -- wsprintf (у которого траблы с портабельностью)
64,5 сек -- нечестный sprintf, только ебаный char.
69,5 сек -- sprintf с конвертированием charbuf'а в нужный wcharbuf
как разница, блядь? и там, и там возвращается указатель на нлуь-терминированную широку строку. остальное - не ебёт.
бля долго объяснять, короче с тем как у меня реализованы строки, такой подход имеет меньший оверхед, чем с встроенными функциями (половина из которых непортабельна)
со встроенными функциями я буду иметь оверхед в двойной strcpy, а со своей функцией я имею только один strcpy.
ты блядь набрасываешься не зная чо и куда у меня в проекте. я блядь не для понта привёл код, а для того что привести число к строке без спринтфов - тривиальная задача.
на сим иди на хуй.
теперь 9,3 сек.
что ещё придумаешь? что я ещё должен добавить?
(но код лучше поправить, чтоб потомки тебя говном не поливали на весь интернет)
хаха, слив защитан )
> (но код лучше поправить, чтоб потомки тебя говном не поливали на весь интернет)
говна здесь нет. точка. я уже устал тебе просто объяснять, что к чему.
велосипед? соглашусь.
говно? нет.
1) богомерзкий гото
2) запись в буфер без проверки (самый главный пункт)
3) практически при любых раскладах после этой функции должно идти что-то подобное strcpy (хочу пример где я не прав)... а это копирование которое можно было спрятать либо внутрь функции, либо построить алгоритм так чтоб буфер заполнялся от начала (чтоб можно было дописывать данные в конец строки, передавая в функцию именно ее конец а не буфер + strcpy)...
в С++ это можно было бы сделать отличным шаблоном и кроме профита получить большую универсальность...
2) я устал повторять, что это nested-функция, она не открытая, буфер _должен быть_ 16 чаров по определению; ассерты - для олигофренов
3) с++ не могу юзать.
надеюсь что ты понял что писать нормальный и легко поддерживаемый код проще чем придумывать отмазки...
нет, не понял. я не тусуюсь с тебе подобными (парнями, которые начинают писать код (или пытаться "критиковать" его), не разобравшись сперва что к чему) :)
поэтому никакие отмазки придумывать не надо :)
P.S. А чем Вам do { ... } while ( n ); не угодил? Почему метка?
на читаемость ну никак не влияет.
Еще в 1971 г Дейкстра открыл, что метки юзают два вида людей: программисты на асме и дегенераты.
потом тестировал, баловался, и оказалось, что по метке быстрее, чем циклом. ты мне скажи: кому от этого плохо, блядь? одно дело когда цикл такой закардкоженный с хуевой тучей переменных, что блядь пиздануться. другое дело - когда в одном месте и всё абсолютно читаемо.
вы блядь узколобые фанатики заебали уже. иди на хуй.
P.S. Как хорошо, что я никогда не умел пользоваться метками.
пиздец, ебанутый тупой фанатик-студентота. слышал звон, что "метки плохо", теперь с умным видом и большим ЧСВ несёшь сию благовесть окружающему люду типа?
говорю же - фанатик, вам похуй на аргументы.
неправильный вывод. с твоей недоаргументации - гото здесь _не имеет преимуществ_, а не _бессмысленен_. так же как не имеет особых преимуществ тут и while. поэтому особой разницы что юзать - тут нет, а ты прикапываешься как просроченная хуилка. да и в этом конкретном примере узреть "спагетти", за которые ругают готосы, может только олигофрен, которому поднять взор на две строки вверх составляет мучительное логическое приключение.
это прямо пиздец, спорить из-за такой мелочи. что ещё предложишь, может поспорим, чо круче: сишарп или с++? вот пиздец достойное студентоты занятье. только без меня, ок?
почему не atoi или _atoi?
код говно чуть более чем полностью и это факт!
дело было давно, но спринтф был медленнее на порядок
> а во сколько раз удобнее?
в смысле удобнее? __cfint_ToWBuffer не публичная функция, сколько раз повторять. "удобной" тут является cfint_ToString, которая органично входит в фреймворк.
> почему не atoi или _atoi?
вроде тоже тормознее + не везде есть.
тьфу ты, вспомнил. мой фреймворк работает с utf16, а atoi работает с UTF8. всралось мне блядь маршалинг делать каждый раз?
>>потом тестировал, баловался, и оказалось, что по метке быстрее, чем циклом.
фига се))) а я свой 4.77 Mhz давно уже выкинул. Не думал, что под него реально еще пишут.
а спринтф тормозит - и всё тут.
я конечно знаю что пхпшники типа тебя ничего сложнее хелловорлда не писали, но для числословомолотилки это всё важно.
1.) читабельностью для человека
2.) читабельностью для компьютера, aka оптимальностью
3.) качеством кода
4.) скоростью написания кода
Я лично для функций такого назначения расставляю приоритеты: 3, 2, 4, 1... Можно согласиться, что использование goto в данной функции - это моветон, но не более. И я тоже согласен, что sprintf тормозной до жутиков. И так же я согласен с мыслью, что если делать вилосипед, то как можно оптимальнее (иначе зачем он нужен?). Придираетесь к фигне какой-то, честное слово.
С другой стороны, мне кажется странным, что goto ускоряет данный процесс. Единственное что я могу придумать, что компилятор как-то криво работает с выравниванием. Возможно надо было провести тест на нескольких системах. Однако если тест показывает, что по какой-то причине goto быстрее, то IMHO, на этом диалог на тему goto должен быть закончен.
Я то выступаю против позиции, обзывать что-либо говнокодом, а что ещё хуже очень некрасиво обзывать других людей из чисто "религиозных" соображений. Всё надо аргументировать, а аргументы по возможности подтверждать фактами.
5 ) удобство использования.
Разбигайся тролль,
Наломает дрофф,
Все почувствуют болль.
как там с++ твой поживает?
дрочишь потихоньку?
вы ещё не думали поспорить на тему с++ VS Delphi с TarasB?
TarasB тоже временами на www.GameDev.ru появляется, но он кароль Delphi
Наверное это вайна?
ну и по поводу делфи на ГД.ру не спорят уже несколько лет...
Если гото тут быстрее, чем нормальный цикл, то попробуй другой компилятор, это ненормально.
1) Использование магического числа 15;
2) wchar_t *ptr вместо cfchar *ptr;
3) Использование безусловного перехода;
4) Проблемы с INT_MIN.
И я не вижу проблемы в том, чтобы пофиксить эти моменты:
1) и 2) - проблем ноль.
3) - гест утверждает, что goto быстрее (хотя бенчи все-таки не привел). Раз код никто, кроме автора, не использует, то и фикс на усмотрение автора.
4) - как уже говорили, загодя подготовленный буфер.
ну давайте заведём константу BUFFER_SIZE_FOR_INT_TO_STRING_CONVERSION , и вместо 15 будем юзать BUFFER_SIZE_FOR_INT_TO_STRING_CONVERSION - 1. Всем сразу полегчает.
> wchar_t *ptr вместо cfchar *ptr;
cfchar это тайпдеф к wchar_t
> Использование безусловного перехода;
Где?
> Проблемы с INT_MIN.
Ага, я уже упомянул :*
Ты правильно уловил идею.
> cfchar это тайпдеф к wchar_t
Правда? А я и не догадывался. Зачем же этот typedef делали, если все равно wchar_t используют, а?
> Где [безусловный переход]?
Это я так goto обзываю, ага.
> Ага, я уже упомянул :*
Молодец. Возьми пирожок на полке.
Все твои аргументы ничтожны. Будь мужчиной, признай это. =D
Ну без тебя бы я не понял какбэ.
> Правда? А я и не догадывался. Зачем же этот typedef делали, если все равно wchar_t используют, а?
Случайно затесался. Все умерли, занавес.
> Это я так goto обзываю, ага.
Если гото идёт после ифа, то это как-то странно его называть безусловным.
> Все твои аргументы ничтожны
Какие аргументы?
> Будь мужчиной
сказал 11-классник UncleALI?
9-класснику cfdev ))
твой код за версту виден
ой, нестандартным
ну почему, почему я лучше всех?..
Не я один считаю, что это "оператор безусловного перехода" (http://ru.wikipedia.org/wiki/GOTO, первое предложение). Но это нюанс, замечание принимается.
>> Будь мужчиной
> сказал 11-классник UncleALI?
Странный наезд. Ты считаешь, что школьник не может быть мужчиной?
ну это буквализм.
> Странный наезд. Ты считаешь, что школьник не может быть мужчиной?
ну так люди мужиками становятся годам минимум к 25.
Ну ты петушок... Я уже им стал в 15.
в моём понимании мужик это взрослый человек, могущий трезво мыслить. хуй совать направо-налево всякая макака может. так вот, формируется мораль пацанчик к 25 минимум окончательно. вот тольког тогда он мужик. а до того - сявка малолетняя.
Ну это в каком-то смысле верно. Только некоторые и в 25 остаются пацанами. Когда я говорил "мужчина", я имел в виду "парень, способный трезво оценивать ситуацию, признавать свои ошибки и отвечать за свои слова". Как-то так.
К тому же, я применил это понятие во фразе, которую можно считать идиомой, по типу "Будь честен с самим собою - [...]". Так что ничего личного.
Даже женьщины?
> Ты правильно уловил идею.
эта константа (BUFFER_SIZE_FOR_INT_TO_STRING_CONVERSIO N) используется причём буквально в одном месте. ты просто сказочный архитектор.
я конечно понимаю, что проболжать стебаться над куском твоего говна очень весело, и еще веселее видеть твою реакцию на эти издевательста...
поэтому я скажу еще раз, когда твой однокласник решит сэкономить 8 байт и на 0,005% ускорить выполнение программы, потом вы будете полгода вместе искать ошибки которые будут лезть изо всех дыр (а уверен что такого говна у вас в коде навалом, асертами то вы не пользуетесь, так как умеете проверять все 7 раз), остальные твои однокласники будут смотреть на вас и думать что С говно, потому что рождает никому неведомые проблемы с памятью, а еще хип у него медленный, потому что им заткнута каждая дырка в коде...
т.е. ты предлагаешь изменить сигнатуру функции на:
cfchar* __cfint_ToWBuffer(cfint n, cfchar* buf, cfuint char_count, cfuint* out_count)
Так? Учитывая, что размер должен быть по определению 16, третий аргумент всегда должен быть 16, а в теле функции (которая на деле является частью другой) будем ассертить - точно ли 16????. В чём профит? Или лучше будет не количество чаров, а количество байт? Тогда можно будет с чистой совестью писать sizeof(buff) и считать себя кулхацкером. Тогда мы введём кучу ненужного говна, типа проверки кратен ли bufsize значению sizeof(wchar_t) (ибо варьируется на разных платформах, если ты не знал), деления на него же (чтобы высчитать количество вайдчаров) и т. д. и т. п. Нахуй вводить эти ненужные, лишние сущности, лишь бы вот чтобы две соседствующие, взаимозависимые функции не делили один семантически общий buf[16]? (16 = 12 чаров на число + 4 на быдловыравнивание). Все эти функции маленькие, соседствуют друг с другом, видимы в пределах одного листа, являются подчастями друг друга (выделено в отдельную функцию, чтобы не дублировать код в паре мест). И ты меня всё равно не убедил, нахуй тут нужно ассертить. Мне это напоминает bool b; if(b == true) {
> а уверен что такого говна у вас в коде навалом
valgrind + тесты не выявляют ничего. Всё воркает. А у тебя поди падает через раз с ассертами твоими. И в отладчике часами ищешь, ха-ха. Глупая макака ты, а не программист.
> и еще веселее видеть твою реакцию на эти издевательста...
ха-ха...
количество элементов нужно передавать как sizeof(buf)/sizeof(buf[0]) - выражение вычисляется в компайл тайме... твоим однокласникам при попытке подсунуть левые данные придется приводить типы, что само собой намекнет на говнокод...
вот о чем я говорю, как можно было допустить ошибку здесь?
> bool b; if(b == true) {
и ты называешь себя гениальным и умеющим все проверять?
ты уверен что валгринд находит порчу памяти? может он находит только утечки?
ассерты для того и нужны чтоб работать при ошибках... если есть ошибки ассерты будут срабатывать, программист это видит и правит их...
// do not localize!
после каждой строки с цыфорками
если бы да кабы, блядь.
ЗЫ и я не сомневаюсь что код никто руками не писал - мы *НИХоводы для это мелкие однострочные скрипты держим. даже на том же шелле это в одну строку делается.
такое впечателение, что все остальные тут пишут под OpenVMS
Вот, например, у нас юзается много подобных структур:
1, ptr1,
3, ptr3,
10, ptr10,
...
Из соответствующей структуры пар на старте делаем массив указателей, чтобы обращаться по индексу.