пятница, 16 июня 2017 г.

Написали...

"Привет! Есть вопрос один рядом с программированием. Я поддерживаю прогу одну, ранее участвовал в ее разработке. Обычно запускали ее на полноценных ноутах и разницы с настольным компом не видели. А вот сейчас запустили ее на мини-ноуте и работает в два раза медленнее. На мини ноуте проц стоит Atom x5-z8350? памяти 4Гб. графика не знаю какая, система 10-ка домашняя 64разряда. Обычно мы работали на Core i5 4570 или старше, оперативки 16Гб, система 7-ка профессиональная. Программа использует .net  При запуске программы на мини ноуте проц нагружается процентов на 10, память - суммарно со всеми службами - процентов на 50. Собственно вопрос - как выяснить, где узкое место? Проц/память/графика/система/платформа/все вместе? Никогда просто этим не занимался - и попал в тупик."

Алгоритм маляра - одна из ПЕРВЫХ причин:
http://russian.joelonsoftware.com/Articles/BacktoBasics.html

По моему скромному мнению - в алгоритме маляра" наблюдается 80% проблем.

Вторая проблема - фрагментированность памяти. "Давить аллокации" - как писал мой друг Максим Лапшин.

Третья проблема - неудачная сортировка в контейнерах. Возможно надо использовать дихотомию (бинарную сортировку) вместо сортировки "пузырьком" (на контейнерах больше 1000 элементов, если верить Кнуту). Ну или использовать "мапы" вместо "векторов".

Ну и как советут Степанов - "сначала набираем данные, потом их фильтруем, , потом трансформируем, потом опять фильтруем, потом сортируем, потом ищем".

Add, Reduce, Map, Reduce, Sort, Find.

Array
.join> [ 1 2 3 "a" ]
.join> [ 3 2 1 "b" ]
.removeDuplicates>
.filter> .ItemIsInteger
.map> .ToString
.filter> .ItemNot "1"
.sort> .AsText
.find> "2"

Четвёртая проблема - работа с файлами, вместо работы с файлами. Кеширование - наше всё.

Пятая проблема связана со второй. "Множество мелких и короткоживущих объектов". Которые часто распределяются. Тут нам поможет шаблон LightWeight:
https://ru.m.wikipedia.org/wiki/Приспособленец_(шаблон_проектирования)

Ну и с этим же связана проблема выделения Mutable и Immutable объектов.

Ну и всяческие "фабрики" и "кеши".

Кешируемые Immutable объекты - "это хорошо".

Опять же - "давить аллокации".

http://www.gamedev.ru/code/forum/?id=205093&page=2

Навскидку - всё.

Ну и профайлер надо конечно использовать.

Больше проблем на своём опыте - я не встречал.

2 комментария:

  1. я бы на атом грешил, то ещё гавно

    ОтветитьУдалить
    Ответы
    1. Ага, может в мощность одного ядра упирается, надо распараллелить.

      Удалить