Защо коментирането на първите два реда от този for цикъл и разкоментирането на третия води до 42% ускоряване?
int count = 0;
for (uint i = 0; i < 1000000000; ++i) {
var isMultipleOf16 = i % 16 == 0;
count += isMultipleOf16 ? 1 : 0;
//count += i % 16 == 0 ? 1 : 0;
}
Зад синхронизирането стои значително различен асемблерен код: 13 срещу 7 инструкции в цикъла. Платформата е Windows 7 с .NET 4.0 x64. Оптимизацията на кода е активирана и тестовото приложение е стартирано извън VS2010. [Актуализация: Repro проект, полезен за проверка на настройките на проекта.]
Елиминирането на междинното булево значение е фундаментална оптимизация, една от най-простите в моята ера от 1980 г. Dragon Книга. Как оптимизацията не беше приложена при генериране на CIL или JIT на x64 машинния код?
Има ли превключвател „Наистина компилатор, бих искал да оптимизирате този код, моля“? Въпреки че симпатизирам на мнението, че преждевременната оптимизация е подобна на любовта към парите, можех да видя разочарованието в опитите да профилирам сложен алгоритъм, който имаше проблеми като този, разпръснати из неговите процедури. Ще работите през горещите точки, но нямате намек за по-широкия топъл регион, който може да бъде значително подобрен чрез ръчно настройване на това, което обикновено приемаме за даденост от компилатора. Силно се надявам да пропускам нещо тук.
Актуализация: Разлики в скоростта също възникват за x86, но зависят от реда, в който методите се компилират точно навреме. Вижте Защо редът на JIT влияе върху производителността?
Код за сглобяване (според заявката):
var isMultipleOf16 = i % 16 == 0;
00000037 mov eax,edx
00000039 and eax,0Fh
0000003c xor ecx,ecx
0000003e test eax,eax
00000040 sete cl
count += isMultipleOf16 ? 1 : 0;
00000043 movzx eax,cl
00000046 test eax,eax
00000048 jne 0000000000000050
0000004a xor eax,eax
0000004c jmp 0000000000000055
0000004e xchg ax,ax
00000050 mov eax,1
00000055 lea r8d,[rbx+rax]
count += i % 16 == 0 ? 1 : 0;
00000037 mov eax,ecx
00000039 and eax,0Fh
0000003c je 0000000000000042
0000003e xor eax,eax
00000040 jmp 0000000000000047
00000042 mov eax,1
00000047 lea edx,[rbx+rax]
var
е компилатор, моля, направете извод за типа на тази променлива и се преструвайте, че вместо това съм написал това. В този случай той ще е извелbool
за себе си. - person Damien_The_Unbeliever   schedule 29.04.2012Имам формуляр, върху който работя, и моят JavaScript за валидиране (jQuery & jQuery validate plugin) работи до определен момент. Настроих jsfiddle, за да го покажа в работно състояние: http://jsfiddle.net/5Ukv2/
Въпреки това, когато използвам функцията/параметъра errorPlacement, тя се поврежда. Грешките отиват там, където съм посочил, но множество грешки се добавят всеки път, когато актуализирам въвеждането (т.е. всяко натискане на клавиш), и когато записът е валиден според JavaScript, грешките не се премахват от моя HTML: http://jsfiddle.net/5Ukv2/1/
Освен това проверката започва да се извършва веднага щом напиша в полето за въвеждане; този проблем е незначителен в сравнение с допълнителните и неотстранените елементи на грешка.
какво правя грешно
Кодът е приложен по-долу за справка, както и в jsfiddles. Коментирах няколко метода, защото те правят ajax извиквания, които няма да работят тук, но валидирането действа по същия начин.
HTML:
JavaScript:
- person Edward Brey   schedule 30.04.2012