Страницы

Поиск по вопросам

Показаны сообщения с ярлыком ресурсы. Показать все сообщения
Показаны сообщения с ярлыком ресурсы. Показать все сообщения

воскресенье, 26 января 2020 г.

Оптимизирует ли это код?

#ресурсы #c #оптимизация #cpp #производительность


Имеется 2 цикла:
for (i = 0; i < a + 1; i++) { }

и
b = a + 1;
for (i = 0; i < b; i++) { }

Вычисляет ли процессор по новой при каждом прохождении цикла значение a + 1?
То есть, по другому говоря, с точки зрения экономии ресурсов код №2 лучше №1?    


Ответы

Ответ 1



Вот результат gcc-4.6.1 на x86-64: #include int main() { int a = 10; for (int i = 0; i < a + 1; i++) { printf("iteration: %d\n", i); } } Собираем gcc -O2 -g -Wall -std=c99 -o test test.c В gdb видим вот такое: 0x400440
push %rbx 0x400441 xor %ebx,%ebx 0x400443 nopl 0x0(%rax,%rax,1) 0x400448 mov %ebx,%edx 0x40044a xor %eax,%eax 0x40044c mov $0x40063c,%esi 0x400451 mov $0x1,%edi 0x400456 add $0x1,%ebx 0x400459 callq 0x400430 <__printf_chk@plt> 0x40045e cmp $0xb,%ebx 0x400461 jne 0x400448 0x400463 xor %eax,%eax 0x400465 pop %rbx 0x400466 retq Т.е. видим, что компилятор сам все прекрасно довел до константы 11 (см. main+30). С другой стороны, вызовы функций стоит делать руками. Вот такое gcc уже не потянул, printf в функции сбил его с толку: #include int foo() { printf("called foo\n"); return 10; } int main() { for (int i = 0; i < foo() + 1; i++) { printf("iteration: %d\n", i); } } Там уже call на каждую итерацию. Premature optimization is the root of all evil —Donald Knuth

Ответ 2



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

Ответ 3



Тут все зависит от компилятора, какой машинный код он сделает. Современные компиляторы (типа gcc) такие ситуации хорошо оптимизируют. Т.е. они все-таки вычислят перед циклом сумму и уже с ней будут делать сравнение.

пятница, 24 января 2020 г.

Как вставить ресурсы локализации в исполняемую сборку?

#c_sharp #winforms #локализация #ресурсы


Привет, народ! Делаю приложение на windows forms (.NET Framework 4.6). Понадобилось
сделать локализацию. Сделал как указано здесь. После компиляции появляются папки с
наименованиями языков ("ru" и "en"), в которых лежат файлы <ИмяПроекта>.resources.dll.
Но мне нужно, чтобы все было в одном исполняемом файле. Если их нет, то язык присутствует
только системный. AssemblyResolve не вызывается, поэтому добавить их в ресурсы и подгружать
когда надо не получится. Есть ли какой-нибудь способ решить этот вопрос или проще сделать
свою локализацию?
    


Ответы

Ответ 1



После более внимательного изучения вопроса, оказалось, что пользоваться стандартными средствами глобализации и не использовать сопутствующие сборки не получится, это заложено в модель ресурсов платформы по умолчанию. Подробности: Упаковка и развертывание ресурсов в приложениях для настольных систем Практическое руководство. Создание локализованной версии файла ресурсов Пошаговое руководство. Локализация форм Windows Forms В таком случае если не устраивает стандартная модель ресурсов и нужна поддержка разных языков в одной сборке - придется строить что-то свое.

четверг, 9 января 2020 г.

Не получается создать в Android Studio новую директорию в папке res

#android_studio #ресурсы #директория


Не получается создать в Android Studio новую директорию в папке res.
Нажимаю создать директорию, она вроде как, создаётся, но нигде не отображается. Снова
пробую создать в той же папке директорию с тем же именем, пишет, что директория уже
существует. Подскажите, пожалуйста, что с этим делать?



    


Ответы

Ответ 1



Так происходит, потому что отображение проекта как Android группирует такие файлы В Project же показывает всё, как расположено на диске Можно использовать генератор ресурсов, чтобы не заморачиваться с созданием папок вручную Выберите тип ресурса layout и имя файла, слева выберите Size и нажмите >> и там выберите размер, папка сама сгенерируется, если она отсутствует В отображении Android данный layout будет отображаться с квалификатором large, а при отображении Project он будет в папке layout-large

среда, 12 июня 2019 г.

Как получить несколько строк из строкового ресурса (windows phone 8.1)?

В файле ресурсов есть строковый ресурс somestring со значением вида "первая строка
вторая строка". Есть TextBlock, в который должны выводиться эти строки, соответственно с переносом строки. Но они выводятся почему-то в таком виде, как написаны, т.е. "
" просто пропечатывается и строки не переносятся. Я пробовал ресурс и привязывать в xaml через x:Uid, и в коде через ResourceLoader, результат один и тот же и не тот, что нужен. Как можно решить это проблему?


Ответ

Вместо
нужно использовать Shift + Enter. Текст в ресурсах не форматируется escape-последовательностями.

суббота, 23 марта 2019 г.

Оптимизирует ли это код?

Имеется 2 цикла: for (i = 0; i < a + 1; i++) { } и b = a + 1; for (i = 0; i < b; i++) { } Вычисляет ли процессор по новой при каждом прохождении цикла значение a + 1? То есть, по другому говоря, с точки зрения экономии ресурсов код №2 лучше №1?


Ответ

Вот результат gcc-4.6.1 на x86-64: #include
int main() { int a = 10;
for (int i = 0; i < a + 1; i++) { printf("iteration: %d
", i); } } Собираем gcc -O2 -g -Wall -std=c99 -o test test.c В gdb видим вот такое: 0x400440

push %rbx 0x400441 xor %ebx,%ebx 0x400443 nopl 0x0(%rax,%rax,1) 0x400448 mov %ebx,%edx 0x40044a xor %eax,%eax 0x40044c mov $0x40063c,%esi 0x400451 mov $0x1,%edi 0x400456 add $0x1,%ebx 0x400459 callq 0x400430 <__printf_chk@plt> 0x40045e cmp $0xb,%ebx 0x400461 jne 0x400448 0x400463 xor %eax,%eax 0x400465 pop %rbx 0x400466 retq Т.е. видим, что компилятор сам все прекрасно довел до константы 11 (см. main+30). С другой стороны, вызовы функций стоит делать руками. Вот такое gcc уже не потянул, printf в функции сбил его с толку: #include
int foo() { printf("called foo
"); return 10; }
int main() { for (int i = 0; i < foo() + 1; i++) { printf("iteration: %d
", i); } } Там уже call на каждую итерацию. Premature optimization is the root of all evil —Donald Knuth