The code

69 отговора 2784 прегледа
в отговор на dummy #41

Re: The code

towa na CBuilder li e sytworeno?
a posle shto geldam na krivo fanowete na Delphi

cykni tuk cykni tam... kwo tolkowa ima da se programira :)

Отговор
в отговор на dummy #42

Re: The code

Hei hora, tova beshe primer za kofti code i go pusnah tuka da se posmeem, ne da vodime voini.
To deto ima edna duma na kalpavia programist ezika mu vinoven. C++ ili Java nekadarnoto si e nekadarno.

Отговор
в отговор на JavaSoft #43

Re: До колкото виждам оригиналния код прави същото.

Абе същото е твърде отностително казано. Аз съм C/C++ програмист и подобни дивотии няма как да ми хрумнат, защото ги няма в речника ми. Тва substring, trim, ... са ми отвлечени понятия.
Хванах един StringBuf с конструктор 8 и на 7 вложени стъпки му append-нах '0' докато X&0xF0000000, X&0x0F000000j, ... дава 0. След това си викам toHex и го добавям и него. Би трябвало да е ефективно, ама знам ли я жабата...
Ако мислиш, че ми е много далече от акъла да сложа една променлива за маска, да врътна един цикъл и да местя маската по 8 бита надясно ( няма разлика дали ще е със или без знак ). Не го направих, защото нямам доверие на Жабата - имам усещането, че прекалено бави местенето на битове. А един такъв цикъл в C щях да го напиша без да се замисля - знам че компилаторът така или иначе ще го разпише ако е по-добре. Виж, ако трябваше да печатам long със сигурност щях да го направя и на Жаба.

На това Жаба Комюнити бих дал само едно предложение - да се забрани Жабата със закон ( строг ).

Имам много различни мерки с вас за 'бързо' :-))))


System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на zaphod #44

Re: ако това е вярно, от утре ставам жабар!

В .НЕТ е съвсем лесно - просто маркираш класа със атрибут:

[Serializable()]
public class TagObject
{
...
}

и фреймуърка автоматично сериализира целия инстанс на обекта чрез BinaryFormatter.

В някои случаи разбира се това не е ефективно, понеже по-този начин се сериализира всичката информация за дадения инстанс което може да е доста като размер при сложни класове и неефективно ако предаваш информация по ограничен ресурс (примерно персистване на инстанс при stateless protocol - като HTTP). Тогава можеш да си направиш сам сериалайзер.

Отговор
в отговор на Skotowydec #45

Re: ако това е вярно, от утре ставам жабар!

какво имаш предвид като казваш "записваш"? искаш да кажеш че има клас който ги прави тия неща автоматично? аз това което описа си го правя "на ръка", обаче като си разглеждам програмите, все има случаи които са разни изключения и пак трябва да се бъхтиш. не знам дали това имат предвид другите като казват че в джава или .нет сериализацията била лесна. има и нещо друго - много от програмите работят с "раздути" данни. така че дори когато може лесно да се сериализират, аз предпочитам трудния подход, за да не правя файлове по 10М.

Отговор
в отговор на Questor #46

Re: The code

> Хм това не е ли един доста добър критерий за кофти програмист -
> когато прави простите неща по много сложен начин.

Според мен това е критерий не само за кофти програмист но и кофти мениджър, продавач, маркетолог, дизайнер и т.н. Има един такъв принцип KISS - Keep It Simple Stupid (прави го просто, глупако) който много добре работи навсякъде където се иска да си напрегне човек мозъка.
Иначе за конкретния случай който цитирах, функцията е съществувала от 10-на години и бизнес логиката е била променяна много пъти. Хората вместо да се позамислят праскат допълнителни IF-ове и така се стига до ситуацията че функцита не прави нищо освен едно просто събиране.

> Кодът му в крайна сметка си върши работата - съответно човек не може
> да каже нищо конкретно против него - освен да го пренапише примерно
> на 1/3 обем - на което дежурният отговор е - "ми кво толкова - то и преди
> си работеше добре."

Аз обикновенно гледам да не се впускам в големи преписвания, освен когато има някаква конкретна полза от преписването. За мен трябва да има причина. Примерно, валидни причини са:

- Кодът има грешки и времето за преписване е сравнимо с времето за закърпване.
- Кодът е прекалено бавен и трябва да се ускори.
- Трябва да се добавя нова функционалност.

Разбира се аз пиша бизнес софтуер, и там изискванията за красота на кода са ниски - той трябва да си работи. Ако човек пише операционна система примерно, критериите са по-различни - там има много повече смисъл да се инвестира в преписване. Половин годишно преписване което ще ускори ОС-а с 10% определено си струва. Двудневно преписване което ще ускори работата на някоя форма с 50% (0.5 сек) не си струва. Освен ако формата не я зареждат по 200 пъти на минута и сървъра издъхва

I am a death dealer. Е така де вампирите по ме накефиха.
Отговор
в отговор на Resurrector #47

Re: See package java.text

Уви единствения (все още в бета) порт на този език работи само на sega dreamcast. Всички опити да бъде портнат на платформа която не съдържа dream в името си са били неуспешни.

I am a death dealer. Е така де вампирите по ме накефиха.
Отговор
в отговор на Colombino #48

Re: До колкото виждам оригиналния код прави същото

> Имам много различни мерки с вас за 'бързо' :-))))
Da, i yavno te sa dosta razlichni ot tova, koeto (moje bi) si uchil vyv FMI-to...

Java si ima kusuri, no te opredeleno ne sa ot tipa "Shift nadyasno s 2 bita e s poryadyci po-bavno ot C", shtoto merim i vremeto na zarejdane na virtualnata mashina ili prostotii ot sorta...

Ta prodyljavay da si optimizirash na drebno za smetka na chetlivost i da si syrbash / nyakoy drug da ti syrba poparata po-kysno.

Отговор
в отговор на Colombino #49

Първият ми пример беше неудачен.

DecimalFormat df = new DecimalFormat("0000"); //4 zeros
System.out.println(df.format(234));

Output is:
0234 // 4 digits with leading zeros


Демек допълва числото отпред с водещи нули до колкото си задал там. В случая 4.

Отговор
в отговор на Potencialen emigrant #50

Re: До колкото виждам оригиналния код прави същото

Хубаво, де на теория и аз знам че трябва да е същото и подобни 'простотии от сорта' каквито предполагаш не ми хрумват. Ама имам такива субективни наблюдения върху код за криптиране, в който има много битови операции. Направо се влачи в сравниние с този на C. Не съм го гледал, може просто преводът да е лош.
Ако смятах, че един цикъл е съществено по-четлив в тази ситуация, щях да го изцикля. Смятай го за лош вкус, защото четимостта ми е първи приоритет.
Що се отнася до обучението във ФМИ: ако допускаш че това е предмет на обучение, то ти си много в страни от нещата. Във ФМИ работим на виртуални компютри и не ни пука за скоростта. Виждал съм как пишат 6 за ИИ-агент, който излезе от един лабиринт малко преди края на втория час. Скоростта е занаятчийска работа.


System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на Creator #51

Re: Ех сладур

не се тревожи за моя софтуер, много добре си върви

Отговор
в отговор на Colombino #52

Re: До колкото виждам оригиналния код прави същото

> ако допускаш че това е предмет на обучение, то ти си много в страни от нещата.
Naprotiv. Moje bi ne si poseshtaval specializiraniya kurs po slojnost na algoritmite (Stela Nikolova go vodeshe), no vse si imal dostatychno sreshti s tova ponyatie (SD, DM, TP, moje bi dori oshte v I kurs po Programirane II).

> Във ФМИ работим на виртуални компютри и не ни пука за скоростта.
Puka ni, veche spomenah. No za teoretichnata takava. A zakonyt na Moore obezsmislya hitrinite na drebno s cel 100, 200, che i 10000% konstantno podobrenie. Tova imah predvid v predishniya si posting.

A za vyprosniya agent shte si pozvolya da citiram Shishkov (znam, che ne go haresvate, i az ne go haresvam, no chat-pat puskashe ideyni lafove):
"Za korektno reshenie na zadacha tip 'Ot Mladost za garata prez Lyulin' pishem 3" (predi pismeniya izpit po SD)
T.e. ako e bil napisan s neoptimalna vremeva slojnost (nay-veroyatno, testoviyat labirint edva li e bil poveche ot 5x5), e sledvalo da poluchi 3. No ako da, i ako shte i do kraya na vtoriya chas da ne e zavyrshil, si e zaslujil 6-ta.

Отговор
в отговор на Potencialen emigrant #53

Re:

Различавам добре скорост от сложност, ама ти май не. И константният фактор има ОГРОМНО значение когато чакаш. Няколко примера ще дам за яснота:
1. Аз свалям един филм за 3-4 часа ( на цена 20 лв/месец ). Ако ти го сваляш за няколко дни дали ще ти е все тая? Пука ли ти, че скоростта на мрежите расте по-бързо от тая на комповете?
2. Бях писал един модул, който при преработка за подобряване от един китаец стана 300 пъти по-бавен ( и значително по-нечетлив ). 300 не е кой знае колко - за 90-тина години комповете ще стигнат тая скорост и ще го докарат същото. Само дето тва беше една НМ, дето се тренираше около час при мен. Накрая дойдоха пак на моето. И тук ли ще ти е все тая?
3. Оптимизирах компилацията на един виртуален стеков процесор. Работеше на един сложен тестов пример за 30+ секунди. Компилацията основно се състоеше от заменяне на езикови единици. Бяха го направили със структура от данни вектор, а за целта беше подходяща верига ( Терминологията е на Шишков, не съм му изпускал лекция.). Само изменяйки сложността от квадратична на линейна, с доста неоптимален код ( прехвърлям си входа в списък, обработвам и пак копирам ), постигнах почти неуловимо време. 'Почти' идва от останалата част. Повече не съм го пипнал, макар че и за останалата част беше по-удачна тази структура.

Та думата ми беше, че ги различавам тия неща. От 1999 г. работя, имам достатъчно опит за да знам кое има смисъл да се бара и кое не. Истина е че понякога се изкушавам да поизтъня нещо което няма смисъл, но вече много рядко. Просто шибаната Жаба ме хвърли в културен шок. Занимавам се все с неща, дето на Жаба се влачат видимо и гълтат МАСА памет , а на C хвърчат. Ако за нещо напусна тая фирма ще е само защото ми се драйфа от Жаба. Жабата може да е много добра за някои неща, ама ние я ползваме точно за тези за които не става.
P.S.
На конкретния изпит за който говоря, моят агент приключваше за около секунда и нещо на изводящата машина на Здравко Марков ( някой знае ли какво стана с тоя човек? Заради него записах ИИ, а той заби да преподава в чужбина ). Можех да дам конкретно нареждане за което ще зацикли, но от нас се искаше да работи за предварително зададен набор тестови задачи. Размерността беше към 5x5, но него вече го нямаше в България и курсът му се водеше от Светла, а тя не е върха на тая наука, така да се каже.


System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на zaphod #54

Re: ако това е вярно, от утре ставам жабар!

Ами не, не става автоматично - защото не мога на С++ автоматично да изброя всички членове на класа. (без някакви макробезумия - вж. темата за сериализацията). Целта при проектирането на системата, която използваме, беше да имаш една обща функция за четене и запис, в която да има по един ред код за всеки member, бил той int, CFooBar* или std::map<CFooBar*, CBaz>. Разбира се, това е осъществимо само за сравнително простите случаи, и има класове, в които в общата функция за четене/запис все пак трябва да се прави if( read ) { blahblah } else {blahblah } - но това са случаи, с които и автоматичната сериализация на Java/C# не би могла да се справи без код.

Колкото размера на документите, принципно си прав, че има случаи, в които представянето в паметта не е най-ефикасното като обем, обаче:

- за някакво морално успокоение "простата сериализация" я пускаме върху stream, който прави LZW-подобна компресия (това ни сви типичните документи от 10-11 на 2-3 МБ)
- дисковото пространство в наши дни са неприлично евтини, и бих оптимизирал по-скоро за load time, отколкото за размер на документа
- простата сериализация е за предпочитане пред сложната от гледна точка на потенциал за възникване на бъгове там - а бъговете са най-скъпото нещо н а света, по-скъпо от дисковото пространство и времето на потребителя.

А по повод указателите още нещо:
Аз напоследък започвам да предпочитам плътни, "плоски" структури без указатели - само с вътрешни индекси. Те позволяват, ако си на адекватна операционна система, да ги memory-map-неш директно в адресното си пространство и са ти готови за работа; ако си на неадекватна, или не дай си боже, трябва да работиш с данни от CD/DVD, да ги заредиш с една read операция. По-бързо зареждане от това няма.

Отговор
в отговор на Pesho® #55

Re: The code

уха - дот нет студиото ми се издигна в очите - мноо гот warning дава на такова нещо - то и

const char* sz = "b";

string g (string (sz));

дава същия ефект :)

Редактирано от Questor на

Отговор
в отговор на Questor #56

Re: The code

Ъхъ, верно студиото се оказва учудващо услужливо в случая :))

warning C4930: '_STL::string g(_STL::string)': prototyped function not called (was a variable definition intended?)

За сравнение, GCC 2.95.4 кротко си мълчи, досущ като на@кано

Отговор
в отговор на Colombino #57

Re: The code

Edva li s cikyla shteshe da vdignesh performance, taka che da ne ti puka. Onia den pravih zamervania, i se okaza che switch-case v Java raboti sys syshtata skorost s koiato i if-else (daje testovete pokazaha che raboti maaaaaaalko po-bavno).

Bez komentar.

Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.
Отговор
в отговор на Mycлoн #58

Re: как не те досрамя...

ltostr ili lltostr

Отговор
в отговор на Skotowydec #59

Re: ако това е вярно, от утре ставам жабар!

аха, успокои ме.
аз под голям файл разбирах точно неприятно голямо време за зареждане. по мое наблюдение повечето програми са отвратителни в това отношение.

Отговор
в отговор на zaphod #60

Re: ако това е вярно, от утре ставам жабар!

(Забележка: Ако смятате, че входния формат - това е XML, а зареждането на документ се състои в прочитането му в DOM дърво, не четете по-нататък.)

За съжаление, бързото зареждане на документи не е нещо, което може да бъде добавено впоследствие - то трябва да е проектирано в самия файлов формат.

Първо, трябва да се организират така нещата, че програмата да зареди малко от документа и веднага да покаже нещо на потребителя, по възможност да му даде и да прави нещо - примерно първата страница от документа. Word веднага показва първата страница, малко след това ти дава и да натиснеш Page Down, след което се почва едно странициране, което може да трае ужасно дълго. Този проблем донякъде се облекчава с memory-map-ване на документа - ти четеш после каквото ти трябва операционната система да се оправя със зареждането на час по лъжичка. Това, ей богу, не ми е ясно как може да се използва практически от Java/C# (от C# сигурно може, ако минеш в unsafe код, ама то тогава това С# ли е? Това си е развален С++ :-) )

Второ, трябва четенето да е едно-единствено, целия файл от начало до край, без междинни скачания на файловия указател напред-назад. Това малко си противоречи с първото изискване - защото предполага да прочетеш целия файл, а не само нужното, но пък има предимството да се връзва добре с концепцията за четене през потоци от Java/C#.

Като цяло, ако не можеш да си позволиш memory-map-ване, най-добре да приложиш някакъв хибрид от двете: прочиташ с едно четене целия файл, но го оставяш в суров вид, със "дискови" структури от данни, и извършваш преобразуванията до "in-memory" структури от данни on demand, само за частите, за които трябва.

Истински отчаяните хора, които трябва да зареждат само краен брой файлове, известни и готови в момента на публикуването на софтуера, правят следното: нормално четене от нормални файлове, контролно пускане на софтуера с всеки документ по веднъж и специален логващ вариант на файловите функции, който освен че чете, прехвърля в нов файл и всички поискани от софтуера блокове данни, един след друг в реда на постъпване на заявките. После, за "истинската" работа на софтуера, се пуска друг специален вариант на файловите функции, който чете от тоя новия файл поред колкото му байта поискат, и игнорира заявките за seek.

Кой е тоя софтуер, дето чете само определен, краен брой файлове, с които се разпространява? Игрите за конзоли.

Отговор