Здравствуйте, netch80, Вы писали:
N>Зато их вполне можно делать инкрементально. Выделить один тред и пол-ядра (или сколько сказано в настройках) на работу statclock profiler (такой, что меряет место работы по таймерным сигналам) и напускать JIT на занятые места, контролируя, чтобы он не превысил разрешённую долю процессорного ресурса системы. Технологически это тривиально.
In addition to this tracking and updating mechanism, NGen now also supports deferred commands. This means that if you want to use NGen with a large application (which may take a significant amount of time to complete), you can queue this command to be completed by the new NGen service. The NGen service is a true Windows® service process that runs in the background and waits for idle time on the machine, at which point it will complete any outstanding compilation jobs that have been waiting in the queue.
Здравствуйте, Eugeny__, Вы писали:
E__>Оу. Делаем одну галочку на чем вам нравится. Принтскрин. Паинт, или что там еще. Вырезаем квадратик. Делаем то же со всем стадиями галочки, которые нам нужны. Вставляем в ресурсы приложения, рисуем картинку. Профит!
А потом пользователь меняет схему аэро и весь твой профит пропадает. Для рисования элементов стандартных контролов есть специальное API, его и надо использовать.
НС>In addition to this tracking and updating mechanism, NGen now also supports deferred commands. This means that if you want to use NGen with a large application (which may take a significant amount of time to complete), you can queue this command to be completed by the new NGen service. The NGen service is a true Windows® service process that runs in the background and waits for idle time on the machine, at which point it will complete any outstanding compilation jobs that have been waiting in the queue.
Я такие сервисы убиваю нвсегда по обнаружении. А также всякие updater, cache и прочую ересь. И тех, кто их не спросив разрешения у юзера ставит считаю ярчайшими представителями сексуальных меньшинств в плохом смысле.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Здравствуйте, Eugeny__, Вы писали:
E__>>Оу. Делаем одну галочку на чем вам нравится. Принтскрин. Паинт, или что там еще. Вырезаем квадратик. Делаем то же со всем стадиями галочки, которые нам нужны. Вставляем в ресурсы приложения, рисуем картинку. Профит!
НС>А потом пользователь меняет схему аэро и весь твой профит пропадает. Для рисования элементов стандартных контролов есть специальное API, его и надо использовать.
transparent спасет
Социализм — это власть трудящихся и централизованная плановая экономика.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, alex_public, Вы писали:
_>>Здравствуйте, gandjustas, Вы писали:
G>>>Ничего, даже если запустится, то работать будет невозможно.
_>>Почему невозможно? А если это какой-нибудь конвертер файлов просто?
G>На мобилке? Где по-умолчанию и доступа к ФС нету?
_>>Кстати, я вообще то сам Java не люблю, но совсем по другим причинам. А тут не могу согласиться с такими наездами на неё — кроссплатоформенность там всё же реальная. G>Ни разу. j2ME сильно отличается j2EE как ни крути. Как в библиотеках, так и в подходе к разработке.
Скоро это различие исчезнет. Oracle сразу после прихода к власти обещал двигаться в этом направлении. И таки двигается. В восмерку уже войдет javafx.
Социализм — это власть трудящихся и централизованная плановая экономика.
Здравствуйте, Иван Дубров, Вы писали:
E__>>Я вам хуже скажу. В джаве можно получить вообще неизвестный класс черти откуда(тупым потоком байт из сети загрузить кастомным класслоадером как Object, но можно придумать и более изощренный сценарий), создать экземпляр(или же вызывать статику — неважно), проверить его на наличие нужного нам метода, и часто вызывать его через рефлексию, даже не кастуя ни к какому известному интерфейсу. И... Внезапно по нему пройдется джит, увидит, что вызываемый метод у класса есть, и его имя в программе статическая строка(т.е. оно выполняется, и будет всегда выполняться именно так). И он его заинлайнит, убрав рефлексию, плюс скомпилит в нативу. Очень прошу примера, как такое возможно в нативе. Это немного похоже на ком(тоже слепой вызов), вот только ком объект не инлайнится никогда. Ваш выход, господа.
ИД>Нет, JIT такую магию не умеет.
ИД>Там всё проще, java.lang.reflect.Method#invoke(obj, args) делегирует вызов через интерфейс MethodAccessor. Насколько я помню, первые сколько-то вызовов испоьзуется стандартная реализация интерфейса, которая делает вызов используя внутренние методы JVM. После какого-то количества вызовов, генерируется специальная реализация MethodAccessor.invoke(obj, args) { return (TargetObject) obj.targetMethod((Type0) arg0, ...) }, которая впоследствии и используется. Т.е рефлексивный вызов становится обычным вызовом через интерфейс + пара кастов. Вот после этого-то как раз и вступает в работу JIT, и уже тогда он может что-то куда-то заинлайнить.
ИД>Попробуй сделать целевой метод приватным, по идее тогда эта оптимизация не должна сработать и вызов будет всегда идти через внутренние методы JVM.
Запусти мой пример. Посмотри на циферки. JIT не такой тупой, как его рисуют.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Можно перечислить основные ограничения "виртуальной машины" дотнета?
Наверняка это всё тут пережёвывалось уже сотни раз. Ну если есть желание ещё разок...
— кривой вызов системных функций и невозможность прямого вызова функций из известных C++ библиотек
— невозможность написания низкоуровнего кода
— невозможность написания быстрого (в сравнение с C++ скажем) кода для ряда задач
— сложности с реализацией автоматического RAII.
Это общие с Java проблемы. А у .Net добавляется ещё отсутствие кроссплатформенности.
В целом в своей нише (написания массы "корпоративного" кода малоквалифицированными программистами) эти недостатки не особо важны и компенсируются преимуществами, так что оба инструмента наверняка будут процветать там и дальше.
Жаль только что фанаты иногда пытаются вытащить технологию из своей нищи и распространить куда не надо.
Здравствуйте, Eugeny__, Вы писали:
E__>Но при этом и дает местами шикарные возможности(та же рефлексия позволяет за счет пары утилитарных классов снижать размер кода в десятки раз, причем если это не берется из конфигов, то тормозит оно ровно до первого прохода jit(ибо реально для каждого случая ровно 1 нить исполнения получается)
Про скорость верю (правда опять же после прогона, т.е. для серверного софта скорее). А вот на счёт полезности вообще... Мне на самом деле не часто приходилось видеть красивые и нужные применения рефлексии. Т.е. специально придумать пример под неё — это не проблема естественно. А вот именно что бы из практики пришёл "запрос" и именно только рефлексия давала бы красивое решение...
E__>я напишу развернутый пост об этом, ибо как раз сейчас занимаюсь переводом сишного проекта в жабу(100 строк с++ превращаются в 10 жабовских), только как закончу, хоть это и не скоро).
Что-то как-то сомнительно. Вообще то как раз Java всегда отличалась многословностью — цена упрощённого синтаксиса. Разве что там какой-то дикий код раньше был. )))
Здравствуйте, Mamut, Вы писали:
M>>>Это все — демагогия, пытающаяся прикрыть отмазки, пытающиеся прикрыть кривизну реализации. Ничего из описанного даже близко не объясняет, почему грид с 20x20 чекбоксами тормозит. MM>>Блин, а я старался. Ну, хорошо, демагогия так демагогия.
M>А ты сам этого не видишь? Понимаешь, 20x20 чекбоксов, как их ни рисуй — это настолько мизер, что даже удивительно, что торможение грида пытаются объхяснить чем угодно, лишь бы не кривизной фреймворка.
забавно другое, что адепты дотнетов и жав когда описывали их преимущества использовали лозунги типа "теперь программисту не нада думать об этих мелочах! даже кухарка сможет теперь писать программы!"
а теперь оказывается, что 400 чекбоксов запихнуть это неправильно и нада думать как сделать правильно, т.е. оказывается что думать, как правильно сделать, всё равно приходится.
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Здравствуйте, Eugeny__, Вы писали:
E__>Ну, ставить com и динамическую подгрузку классов в жабе(а там еще и класслоадер можно заменить — иногда это такие возможности дает) — это глупость. Ком — это действие вслепую, и вообще дикий костыль.
Ммм, ну оно конечно не такое симпатичное как в Java, но нужные задачи решает на самом деле. Хотя мне кажется что как раз это и есть область где Java может победить.
Как пример в последнее время вижу больше онлайн-банкингов через Java, а не через ActiveX. Хотя лично мне больше нравится вообще на html.
Здравствуйте, alex_public, Вы писали:
_>- кривой вызов системных функций
Что значит кривой?
_> и невозможность прямого вызова функций из известных C++ библиотек
Это не соответствует действительности. Слинкованные в dll функции вызываются без проблем. Для статической линковки есть МС++.
_>- невозможность написания низкоуровнего кода
Какого именно?
_>- невозможность написания быстрого (в сравнение с C++ скажем) кода для ряда задач
Ты CLR с конкретными языками не перепутал? Если что, С++ в IL прекрасно компилируется.
_>- сложности с реализацией автоматического RAII.
При чем тут CLR? Это особенности конкретных языков, не более того.
_>Жаль только что фанаты иногда пытаются вытащить технологию из своей нищи и распространить куда не надо.
Здравствуйте, Иван Дубров, Вы писали:
ИД>Здравствуйте, Eugeny__, Вы писали:
E__>>Я вам хуже скажу. В джаве можно получить вообще неизвестный класс черти откуда(тупым потоком байт из сети загрузить кастомным класслоадером как Object, но можно придумать и более изощренный сценарий), создать экземпляр(или же вызывать статику — неважно), проверить его на наличие нужного нам метода, и часто вызывать его через рефлексию, даже не кастуя ни к какому известному интерфейсу. И... Внезапно по нему пройдется джит, увидит, что вызываемый метод у класса есть, и его имя в программе статическая строка(т.е. оно выполняется, и будет всегда выполняться именно так). И он его заинлайнит, убрав рефлексию, плюс скомпилит в нативу. Очень прошу примера, как такое возможно в нативе. Это немного похоже на ком(тоже слепой вызов), вот только ком объект не инлайнится никогда. Ваш выход, господа.
ИД>Нет, JIT такую магию не умеет.
Угу. А скорение в 100 раз — это миф, да?
Там же нет особой магии. Просмотреть нить исполения, выяснить, что она одна, да напрямую сделать.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Да, обязательно. Бо сравнивать на разных машинах глупо.
H>Кстати, твой тест я запустить не смог: H>
H>java version "1.6.0_14"
H>Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
H>Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)
H>
H>Exception in thread "main" java.lang.NoClassDefFoundError: Main/class
H>Caused by: java.lang.ClassNotFoundException: Main.class
H> at java.net.URLClassLoader$1.run(Unknown Source)
H> at java.security.AccessController.doPrivileged(Native Method)
H> at java.net.URLClassLoader.findClass(Unknown Source)
H> at java.lang.ClassLoader.loadClass(Unknown Source)
H> at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
H> at java.lang.ClassLoader.loadClass(Unknown Source)
H> at java.lang.ClassLoader.loadClassInternal(Unknown Source)
H>Could not find the main class: Main.class. Program will exit.
H>
java -server Main
В папке с классом. Не забываем о больших и наленьких буквах — main и Main — это два разных ксласса!
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Здравствуйте, Ночной Смотрящий, Вы писали:
_>> и невозможность прямого вызова функций из известных C++ библиотек НС>Это не соответствует действительности. Слинкованные в dll функции вызываются без проблем. Для статической линковки есть МС++.
С моно не работает.
_>>- невозможность написания быстрого (в сравнение с C++ скажем) кода для ряда задач НС>Ты CLR с конкретными языками не перепутал? Если что, С++ в IL прекрасно компилируется.
Процессор IL выполнять не умеет. А JIT по качеству оптимизаций до промышленных C++ компиляторов не дотягивает.
Здравствуйте, MxMsk, Вы писали:
MM> Может он эффекты битмэповые накатил — они переводят отрисовку в программную и сейчас уже obsolete. О! Я тут подумал. А может быть у него Binding-и слетели и Студия постоянно пишет об этом сообщения в Trace? Это может вызывать тормоза при отладке, которых в Release, естественно, нет.
Здесь будем воевать, а не выяснять по делу, поэтому:
1) биндинги не слетели и никаких эффектов нет (куда к черту)
2) компьютеры... не самые слабые, но не фонтан: (P4 или младшие C2Duo, 1-2ГБ памяти, видео не знаю какое)
3) сначала я использовал реализацию здесь от известного гуру Джоша Смита. Она тоже тормозит и имеет другие еще недостатки.
Вопросы: кто виноват? Достаточно ли быстр WPF? Оптимально ли сделал Смит? Не дурак ли я, что сделал чекбоксами вместо кастомных значков?
Конечно, можно, как и написал мыщъх, сделать все ручками: обрабатывать клики, отказаться от биндингов... и т.д.
Будет быстро (наверно).
Но у меня тут пресловутый "энтерпрайз". То есть — делайте быстрее, требования допридумываются по ходу.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Здравствуйте, Eugeny__, Вы писали:
ИД>>Нет, JIT такую магию не умеет.
E__>Угу. А скорение в 100 раз — это миф, да? E__>Там же нет особой магии. Просмотреть нить исполения, выяснить, что она одна, да напрямую сделать.
Нет, перечитай внимательнее, что я написал. Это не JIT такой умный, а реализация reflection-а.
Здравствуйте, Eugeny__, Вы писали:
E__>Угу. А скорение в 100 раз — это миф, да?
Ускорение в сравнении с чем? С заведомо плохо соптимизированным JITом жабьим же кодом?
У тебя там кстати не 1000 вызовов а 500. Вот почему:
for(long i = 0; i < 1000; i++) {
result += (Long)method.invoke(coolClassInst, i, i++);
}
Надо бы на i+1 поменять.
Ради интереса прогнал исправленный код на своём компе.
...\jdk1.7.0_03\bin>java.exe -server -cp test Main
4925359
2600712197
62511
1876919424
Пока я вижу что первый проход выполнялся просто из рук вон плохо: 4925.3 нс на вызов.
Второй проход стал лучше: 62.5 нс на вызов.
Ради интереса возьмём С++ код, который будет вызывать такую же функцию из динамически загруженной DLL (LoadLibrary + GetProcAddress).
Уж извини, но COM для теста мне писать ну совсем неохота. Поэтому в ближайшем приближении.
1000 вызовов точно померять очень сложно, даже используя RDTSC. Поэтому мерять буду 1М вызовов. JIT тут нету, поэтому вмешаться некому.
1000000 вызовов, 0.001950118 секунд. Это по 1.9 нс на вызов. В ~32 раза быстрее чем смог заинлайнить JIT.
Давай теперь заинлайним и там и там: теперь вызываемая функция static и в том же классе.
...\jdk1.7.0_03\bin>java.exe -server -cp test Main
61890
245393108
2799
1876919424
Что даёт нам 61.9 нс для первого прохода, и 2.8 нс после JIT.
Результаты С++: 1000000 вызовов, 0.000082465 секунд. Получаем 0.082 нс на вызов. Опять быстрее, в ~34 раза.
Здравствуйте, Eugeny__, Вы писали:
E> Аааа, начерта так много кода???? Для простейшей операции!
Ты про TCoolClass?
E> Я думал, джава по оверхеду на высоте, но паскаль — явно выше.
Так паскаль всегда был языком с довольно громоздким синтаксисом и строгим требованием к описанию всего и вся. Важно ведь, чтоб читать было легко, а написать руки не отвалятся.