Да простит меня великий Visor....Не удержалсо

О чем вы тут пишете? В цикле или 0 или 1 итерация.
Так же можете померять время итерации "a"+"b"
То есть к чему цикл в 100000 итераций? Попытка перевести тему в другую сторону - так опять же я дал самый правильный ответ, что для достижения максимальной скорости выполнения нужно писать на ассемблере - и это никто пока не смог опровергнуть.

Корону тут натягивают как раз все кому не лень, посмотрите свои ответы.

Неправильный ответ ни для 0 ни для 1 итерации цикла, измерять нужно то что есть в задаче 1 поста, а не в выдуманном примере, который хочется измерять - там вообще-то все очевидно было еще до него.
getCommand() задается 1 раз при создании объекта.
Насчет добавить StringBuilder Для 0 итераций очень сильно ускорит и сделает конфетку?
Да и вообще у вас ответы противоречат - нельзя выбрать или быстрее или экономнее.
Самый экономный вариант памяти, который при создании объекта занимает минимальное кол-во памяти, другой вариант - это если переписать без конкатенций строк - этот вариант будет самый быстрый, быстрее чем любые StringBuilder. Это очевидно, странно что реальную оптимизацию не никто смог сделать - вы же писали столько слов .... и даже не смогли найти что оптимизировать ....
Почему никто не смог ничего придумать, кроме глупого цикла на 100000 итераций вместо 0-1 реальной итерации - померяйте что будет быстрее при 0-1 итерации предложенного примера - вы узнаете реальный ответ.


Доказали что при 0-1 итерации что? Я что-то не вижу доказательств.
Признать ошибку, что вы меряете то что и так очевидно? Я признаю, что я вижу очевидные ответы и их называю.
Чушь - это придумывать какие-то фантазийные сценарии - код в 1 посту где там 100000 итераций?

Вы написали пример, который не отражает предметную область вопроса, о чем может быть обсуждение - это же очевидно. Удачи в фантазийном мире оптимизаций.
 
В scala, как я понимаю, все иначе?
Scala синтаксически мощнее язык. Но все же та же jvm.
Оптимизация дурное дело, просто как оптимизировать места которые ты не контролируешь, в этом и тупик.
Java(jvm) - как ракета с радиусом поражения. Стоит задача убить человека, Вам придется стрелять ракетой, убьете его, рядом стоящих, еще ближайшие строения в радиусе поражения, уничтожите. Хотя надо просто по тихому убрать.

Самая быстра программа возвращает сразу результат.
ПС я не пьющий человек.
 
Получилось, один написал глупую тему, другие не смогли понять, что GenCloud не соображает ничего, потом еще один velafrys написал пример, не отражающий предмет вопроса, а потом все бросились отвечать на неправильный вопрос.
Что уж тут сказать, можете одеть короны.

Ты вроде не глупый, мог бы пояснить народу, что они вообще не о том говорят, что если нужно оптимизировать класс - нужно не StringBuilder добавить, а убрать конкатенции строк, насколько это возможно.
 
Все поняли что ты необразованное существо, не умеющее... даже не так - не научившееся еще делать выводы и нюхать правильно кокс.
 
Код:
package actor;

public class TextBuilder {
    class Entry {
        String value;
       
        Entry next;
       
        Entry(String value) {
            this.value = value;
            this.next = null;
        }
    }
   
    int size = 0;
   
    Entry head;
   
    Entry tail;
   
    public TextBuilder() { }
   
    public TextBuilder append(Object value) {
        return append(value.toString());
    }
   
    public TextBuilder append(String value) {
        size += value.length();
        if(head == null)
            head = tail = new Entry(value);
        else
            tail = (tail.next = new Entry(value));
        return this;
    }
   
    public String toString() {
        char[] chars = new char[size];
        int offset = 0;
        for(Entry target = head ; target != null ; offset += target.value.length(), target = target.next)
            for(int i = 0 ; i < target.value.length() ; i++)   
                chars[offset + i] = target.value.charAt(i);
        return new String(chars);
    }
   
    public static void main(String...arsg) {
        TextBuilder text = new TextBuilder();
        for(int i = 0 ; i < 100000 ; i++)
            text.append(i);
        text.toString();
    }
}

Код:
    protected void showMainPage(L2PcInstance player)
    {
        //NpcHtmlMessage adminReply = new NpcHtmlMessage(5);

        TextBuilder reply = new TextBuilder();
        reply
            .append("<html><title>")
            .append(getName())
            .append("</title><body>")
            .append("<table width=\"292\" bgcolor=\"666666\"><tr><td><font color=\"LEVEL\">[ ")
            .append(getName())
            .append(" ]</font></td>")
            .append("<td><button value=\"Back\" action=\"bypass -h ")
            .append("admin_events")
            .append("\" width=75 height=15 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td>")
            .append("</tr></table>")
            .append("<br><center>Engine instances</center>")
            .append("<table width=\"292\">");
     
        for (L2EventGroupEngineInstance event : _eventInstances.values())
            reply.
                append("<tr><td><font color=\"LEVEL\">").
                append(event.getName()).
                append("</font></td>").
                append("<td><button value=\"Show\" action=\"bypass -h ").
                append(getCommand()).
                append("_show ").
                append(event.getName()).
                append("\" width=60 height=15 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td>").
                append("<td><button value=\"Edit\" action=\"bypass -h ").
                append(getCommand()).
                append("_edit ").
                append(event.getName()).
                append("\" width=60 height=15 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td>").
                append("<td><button value=\"Delete\" action=\"bypass -h ").
                append(getCommand()).
                append("_del ").
                append(event.getName()).
                append(" $name").
                append("\" width=60 height=15 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr>");
       
        reply
            .append("</table>")
            .append("<table width=\"292\"><tr><td><edit var=\"name\" width=\"125\"></td>")
            .append("<td><button value=\""+"Create New Event"+"\" action=\"bypass -h ")
            .append(getCommand())
            .append("_create $name")
            .append("\" width=125 height=15 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr>")
            .append("</table>")
            .append("</body></html>");
       
        adminReply.setHtml(replyMSG.toString());
        player.sendPacket(adminReply);
        // Send a Server->Client ActionFailed to the L2PcInstance in order to avoid that the client wait another packet
        player.sendPacket(ActionFailed.STATIC_PACKET);
    }
 
Дегенерат, не нужно делать вывод за других людей. Если ты не понимаешь элементарных вещей - то не значить что все вокруг такие же или глупее тебя.

Неправильный ответ, правильный ответ решить вопрос в частном порядке убрав общее решение, это позволит переложить время выполнения на время клонирования решения в частных имплементациях.

То есть, чтобы было понятно: этот класс перестанет существовать, и время его выполнения при любых вариантах будет равен 0.
 
Речь больше идет о Вашем подходе, а не о эффективности решения.

GenCloud ещё тот клоун, конечно, но вы друг друга стоите, господин Visor123, имхо.
 
.................. (спасибо администрации за смайлики)

version 0.1
delete method append(Object);
add new method append(Object...)
Код:
public class TextBuilder {
    class Entry {
        String value;
     
        Entry next;
     
        Entry(String value) {
            this.value = value;
            this.next = null;
        }
    }
 
    int size = 0;
 
    Entry head;
 
    Entry tail;
 
    public TextBuilder() { }
 
    public TextBuilder append(String value) {
        size += value.length();
        if(head == null)
            head = tail = new Entry(value);
        else
            tail = (tail.next = new Entry(value));
        return this;
    }
 
    public TextBuilder append(Object...value) {
        int i = 0;
        if(head == null && value.length > 0) {
            String str = value[0].toString();
            size += str.length();
            head = tail = new Entry(str);
            i++;
        }
        for(; i < value.length ; i++) {
            String str = value[i].toString();
            size += str.length();
            tail = (tail.next = new Entry(str));
        }
        return this;
    }
 
    public String toString() {
        char[] chars = new char[size];
        int offset = 0;
        for(Entry target = head ; target != null ; offset += target.value.length(), target = target.next)
            for(int i = 0 ; i < target.value.length() ; i++) 
                chars[offset + i] = target.value.charAt(i);
        return new String(chars);
    }
}

Код:
    protected void showMainPage(L2PcInstance player)
    {
        NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
        TextBuilder reply = new TextBuilder();
        reply
            .append(
                "<html><title>",
                getName(),
                "</title><body>",
                "<table width=\"292\" bgcolor=\"666666\"><tr><td><font color=\"LEVEL\">[ ",
                getName(),
                " ]</font></td>",
                "<td><button value=\"Back\" action=\"bypass -h ",
                "admin_events",
                "\" width=75 height=15 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td>",
                "</tr></table>",
                "<br><center>Engine instances</center>",
                "<table width=\"292\">"
            );
        for (L2EventGroupEngineInstance event : _eventInstances.values())
            reply
                .append(
                    "<tr><td><font color=\"LEVEL\">",
                    event.getName(),
                    "</font></td>",
                    "<td><button value=\"Show\" action=\"bypass -h ",
                    getCommand(),
                    "_show ",
                    event.getName(),
                    "\" width=60 height=15 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td>",
                    "<td><button value=\"Edit\" action=\"bypass -h ",
                    getCommand(),
                    "_edit ",
                    event.getName(),
                    "\" width=60 height=15 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td>",
                    "<td><button value=\"Delete\" action=\"bypass -h ",
                    getCommand(),
                    "_del ",
                    event.getName(),
                    " $name",
                    "\" width=60 height=15 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr>"
                );
        reply
            .append(
                "</table>",
                "<table width=\"292\"><tr><td><edit var=\"name\" width=\"125\"></td>",
                "<td><button value=\""+"Create New Event"+"\" action=\"bypass -h ",
                getCommand(),
                "_create $name",
                "\" width=125 height=15 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr>",
                "</table>",
                "</body></html>"
            );
     
        adminReply.setHtml(reply.toString());
        player.sendPacket(adminReply);
        // Send a Server->Client ActionFailed to the L2PcInstance in order to avoid that the client wait another packet
        player.sendPacket(ActionFailed.STATIC_PACKET);
    }
 
Я так понимаю, что вместо того, чтобы немножко подумать все решили, что класс не оптимизирован, потому что содержит конкатенции?

Начнем с того, что почему вы убрали за скобки задачу, стоимость выполнения, а так же стоимость вашего времени?
И второй немаловажный момент - не имплементация определяет задачу, а задача имплементацию.

Проблема всех умников, которые идут по пути оптимизации в том, что они не считают стоимость выполнения и стоимость своего времени. Так же не смотрят на задачу, а только на конечный вариант.
Простой пример - данный класс имеет общее решение задачи, но наиболее быстрым является частное решение задачи, но тогда в каждом частном решении будет клонирование решения этой общей задачи, но уже в более быстром варианте.
Посчитаем стоимость выполнения класса - класс управляет созданием, отображением странички, сохранением и редактированием движка групп-эвента.
Предположим что 2 метода каждый по 1 вызову займут макс 0,5мс. За полгода добавлять движок эвента может понадобится максимум раза 2, создать + написать имя, сохранить. Это пара операций, и больше отображений. Я считаю, что потеря 100мс выполнения за пол года не критично для сервера.
Класс не содержит рекурсий и блокировок и не может вызвать лаг сервера - значить время его выполнения можно считать чистым.

Теперь мое время - при имплементации задач в виде частных случаев общее решение этого класса будет клонировано на частные решения - что потянет мое время как минимум замены имен в частных строках команд, далее частные решения будут забирать время фокусировки внимания и понимания того, что решение не оптимально с позиции логики решения несколько раз одинаковых задач.

То есть стоимость в 100мс за пол года стоит общего решения задачи и экономит кучу моего времени. Логика решения общих вопросов отделена от частных случаев и оптимизирована для редкого использования и 0-1 итераций.

Вопрос решен.

Не нужно меня подсовывать к GenCloud - одно из отличительных свойств в том, что я не вру.

Всегда важно эффективность решения, а не подход.
Подход - это набор инструментов/скилов по сути, а эффективность работы - это результат - людям нужен результат.
Пока вы не поймете таких простых вещей, вы будете задавать неправильные вопросы и иметь неправильные ответы.


Решение не должно содержать цикла, тогда оно будет максимально быстрым из простых. То есть ты просто не в том уровне ищешь решение.
 
Последнее редактирование:
Жизни меня учить не нужно, хорошо?
Вы моей работы не видели, а я Вашу видел.
 
Жизни меня учить не нужно, хорошо?
Вы моей работы не видели, а я Вашу видел.
Вообще-то можешь узнать у любого заказчика, что ему важно. Для этого я не нужен.
То что ты не считаешь эффективность решения фактором в решении задачи - то это не значит, что я учу тебя жизни - жизнь сама тебя научит.

Я тут никого не обманул - я сразу дал правильные ответы, и сейчас после долгих намеков дал готовые решения. Не нужно на меня за это обижаться, потому что ты не был готов к реальной оптимизации, но не в 1 плоскости, а в объеме вопроса с большим кол-вом факторов и с учетом собственно самой задачи.
 
"Программа не должна содержать кода"
Я тут с вами не играю в абстрактный код.
Потом давайте не уходить в гипотетические условности, типа: ассемблер, код, быстрее. Набор слов и только.
Вы с начало свой код в соответствие своим словам приведите, а то диссонанс возникает, говорите одно, а на деле другое. Уровень студента, второго курса, лабораторная работа по программирование. В продакшн такой код не пустят, по рукам бить будут нормальные люди.

ПС я тут просто развлекаюсь
 

Для Вас все Ваши ответы - правильные. Таковы правила всех самовлюбленных людей, вне зависимости от их рода деятельности.
Мое правило простое - видишь не инлайновую конкатенацию? Это говнокод.
Почитайте на досуге, кстати, того же Макконнелла, как минимум.
 
Так я и не ухожу, в случае частного решения задачи этого класса не будет вообще, а задача будет решена без цикла и без конкатенций в методе с командами.
Но поскольку основная задача значительно больше, то общее решение за 100мс в полугодие оптимально.

Код и так приведен в соответствие, посчитай сколько будет стоимость 0 итераций конкатенций.

В продакшн? Посмотри на масс-эвенты свои - насколько они похожи на продакшн ...
Ты разве не понял, что при частном решении конкатенции не будет?

Опять неправильный вопрос и неправильный ответ. Правильное решение зависит не от твоей точки зрения, а от эффективности решения задачи.
То есть можно заглядывать в середину - но когда я говорю что кол-во итераций цикла 0 - то почему-то ты пытаешься говорить что ты там что-то оптимизировал.
При 0 времени выполнения ничего ты не оптимизировал, и с большой вероятностью с 1 итерацией тоже.

Я могу переписать так, что этого класса не будет, но это не оптимальное решение задачи, и значить говнокод. То есть любое другое решение задачи приведет к излишнему коду и не оптимизирует стоимость времени разработки и стоимость времени выполнения, потому что сколько 0 не умножай, время все равно будет 0. Просто расход времени переместится в другое место.

Я понимаю, что ты не понимаешь что я пишу, и чем отличается частное решение задачи от общего, но простые вещи всегда сложно понять. Проще говоря, код уже оптимизирован до 0-1 итерации. И то что ты не в состоянии этого понять не делает его говнокодом.

Вся проблема в том, что вы себе изначально неправильно сформулировали задачу, и соответственно любой ответ является не оптимальным. Вы даже после стольких страниц не поняли, что в цикле будет 0-1 итерация и не нужно городить велосипед. И что при оптимизации задачи(не кода) не будет ни конкатенций ни цикла. То есть вы даже не поняли - что оптимизация задачи, это не пристраивание еще одного билдера в код, а решение задачи по другому.
Есть книги, где авторы обращают внимание на реальную стоимость выполнения, на стоимость(время) разработки - но так делают не все, и бывает, что студенты такие вещи пропускают.

Вот когда вы напишете кучу частных случаев решения однотипных задач, вы поймете о чем я написал.
Я даже помогу понять, тем кто сможет задать правильные вопросы.
Не нужно меня винить, в том, что вы задали себе неправильные вопросы и получили неправильные ответы.
Факт так и остался в том, что задача решена эффективно и оптимально.
 
Последнее редактирование:
здесь был smeli и отсыпал травки.

Только что подумал, если бы ваш код пихнули в книгу "совершенный код", начал ржать как гиена, в слух. Эталон...
 
Вы почитайте лучше вот этот бред, нашелся литературный критик "Но с точки зрения написания" - это он про код так пишет. GenCloud ты с точки зрения буквы смотришь или их жопы? Где твоя точка зрения?
 
Последнее редактирование:
Оффтоп:
Вангую пора вмешаться.
 
Повторюсь - неправильные с Вашей точки зрения.
Что ты несешь - посмотри, что конкретно ты привел в примере - цикл с 100000 итерациями - я у тебя что спросил - где ты нашел в коде цикл где может быть 100000 итераций? Ты что написал - единственный цикл - но там не с моей точки зрения, а объективно 0-1 итераций может быть. То есть фантасты не смогут этого типа эвента значительно больше пары-тройки для л2 придумать.
Объясняю - это не твт или цтф, это интеграторы типа - Турнир.

Какое это только мое мнение? Придумай штук 10 хотя бы.
 
Последнее редактирование: