LINUX.ORG.RU

а правильно ли?

 


0

1

Ради интереса решил проверить, сколько тактов процессора занимает выполнение функций из самописной библиотечки.

После бессонной ночи накидал за пару минут такой код, и завалился спать:

functest.c:

#include <stdio.h>
#include "library.h"

extern unsigned long long _tsc(void);

int main(int c, char **v) {
	float arg, ret;
	unsigned long long test, start_tsc;
	int i;
	sscanf(v[0], "%f", arg);
	test=0;
	for(i=0;i<=10;i++) {
		start_tsc = _tsc();
		ret = lib_func(arg);
		test += (_tsc()-start_tsc);
	}
	printf("%lld\n", test/10);
	return 0;
}

rdtsc.asm:

GLOBAL _tsc
_tsc:
	rdtsc
	ret

Сборка:

nasm -f elf32 rdtsc.asm
gcc -c functest.c
gcc functest.o rdtsc.o library.so -o functest

Собственно, будет ли оно показывать то что надо, или всё-таки температуру на марсе?


сколько тактов процессора

О мой бог

shamaz
()

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

Deleted
()
Последнее исправление: control (всего исправлений: 1)

Не надо «накидывать» такой код, его нужно или копипастить из заведомо верных источников, или писать осознанно, почитав руководство по ISA.

tailgunner ★★★★★
()
Ответ на: комментарий от Deleted

А может они не нужны эти уровни?
Вот из за таких мыслишек, и появляються дотнеты и прилоги по полчаса загружающиеся.

Как только ты сделаешь первый шаг по темному пути, ты уже не сможешь с него свернуть...

batbko
()
Ответ на: комментарий от alex_custov

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

Плюс ты не поверишь - но есть места где достаточно всего пары и самопальных

batbko
()

А посчитать количество выполненных инструкций и поделить на некую среднюю величину не вариант? По идее должно как минимум дать возможность прикинуть и не надо париться как это сделать.

batbko
()
Ответ на: комментарий от shamaz

Одна нет, но если их там ощутимое количество - то среднее арифметическое даст возможность сделать оценку.

Ибо есть минимум и максимум, для любой архитектуры.

batbko
()
  1. Убедись, что оба вызова rdtsc исполняются на одном ядре процессора. Самый простой вариант - запустить процесс на одном ядре при помощи taskset.
  2. Ищи не среднее время работы, а минимальное.
  3. Учитывай влияние кешей памяти.
  4. Если твоя функция работает достаточно быстро, то вызывай её между замерами не один, а N раз.
  5. Компилируй с флагами оптимизации.
NeXTSTEP ★★
()
Ответ на: комментарий от batbko

Я думаю, ничего это не даст.

Ибо есть минимум и максимум, для любой архитектуры.

Можно тыкнуть пальцем между ними, но разница может быть большой, так что что это даст ТС'у я не знаю.

shamaz
()
Ответ на: комментарий от shamaz

Может быть, а может быть и нет, если там один fpu, например, то оценка будет достаточно точной, я по этому и спрашивал у ТС.

Я то, уже давно на темном пути, так что с асмом дела не имел очень много времени, вот и кинул предположение.

batbko
()
Ответ на: комментарий от batbko

Нет, но те что пишуться должны писаться вдумчиво

А Qt, скажем, написана не вдумчиво? По каким критериям?

не есть лишний перфоманс, предоставля свистоперделки, которые требуют дополнительного периода вхождения

а кто его ест? Например, конкретнее про свистоперделки

Плюс ты не поверишь - но есть места где достаточно всего пары и самопальных

Есть места где можно и на MASM32 написать (то что в Linux и не снилось), но речь же не о них.

alex_custov ★★★★★
()

обычно в таких случаях просто запускают нужную функцию 100500 раз в цикле и замеряют время работы [bash]time ./a.out[/bash]

yekka
()
Ответ на: комментарий от alex_custov

Ну прям как ребенок, ей богу.

Qt написан хорошо, для своей области применения. Но это, GUI фреймворк, а для гуя перфоманс не так важен, поэтому там мы видим те самые свистоперделки (в конкретном случае, окупающие время, на изучение), например мета система(те же сигналы/слоты), огромные, но удобные строки, qml.

А вот MFC, это крайне сомнительный слой абстракции, требующий изучения, и практически не приносящий профита, по сравнению с использованием WinApi.


Есть места где можно и на MASM32 написать (то что в Linux и не снилось), но речь же не о них.

Покажи мне что нибудь, что можно написать на masm32, но нельзя на fasm:), ну это так оффтоп...

batbko
()
Ответ на: комментарий от Deleted

Нет. «Двадцать уровней абстракций» не являются «горячим» местом в коде.

anonymous
()
Ответ на: комментарий от batbko

например мета система

то есть метасистема - это плохо и спистоперделка? Чем именно? Какие накладные расходы она даёт на голом приложении без использования сигналов и других moc-специфичных вещей? Факты, цифры.

огромные, но удобные строки

чем они огромные, можно узнать конкретику?

qml

QML - это отдельный модуль, он вообще никакого отношения не имеет к классической программе на Qt Widgets.

Покажи мне что нибудь, что можно написать на masm32, но нельзя на fasm:), ну это так оффтоп...

под какую ОС?

alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov

Чувак, мне влом, если тебя забанили в гугле - мне жаль.

Глянь сорцы, те же строки унаследованны в том или ином виде от QSharedData - что есть оверхед, т.к. там как минимум copy on write реализован, надеюсь большой мальчик сам поймешь почему это оверхед. Огромные они потому что внутри там юникод, всегда, по крайней мере в 4 и 3 было так.

под какую OC?

Ну очевидно же что под win32 или дос, ибо я чет не вкурсе где ещё работает masm32, ну может os/2 какой нить, но это уже некромантией попахивает.
Хотя зачем под ОС? Этож ассемблер...

Вообщем какой то пустой и скучный разговор, ниочем ты ведешь, да ещё и оффтоп, да ещё и в решенной теме.

batbko
()
Ответ на: комментарий от batbko

Чувак, мне влом, если тебя забанили в гугле - мне жаль.

Лучше признай, что ты что-то не то сказал, а не сливайся.

QSharedData - что есть оверхед, т.к. там как минимум copy on write реализован, надеюсь большой мальчик сам поймешь почему это оверхед

нет, не понимаю. В Qt4 очень много классов зашарены, чем же это оверхед? Слушаю факты и конкретику, где она? Где конкретика про метасистему?

Огромные они потому что внутри там юникод

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

alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov

Если ты считаешь,что реализация copy on write для строк ради пары кейсов, не оверхед. Тогда тут совершенно не о чем говорить, ибо это как раз оверхед - лишние телодвижения и/или ресурсы без видимой пользы.

batbko
()
Ответ на: комментарий от batbko

это как раз оверхед - лишние телодвижения

чувак, а ты видел статью об оптимизации перемножения матриц что была на хабре (http://habrahabr.ru/post/114797), где быстрый оптимизированный код был в два раза больше оригинального?

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

alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov

это как раз оверхед - лишние телодвижения

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

где быстрый оптимизированный код был в два раза больше оригинального

Это, всего лишь, значит, что там нужно было оптимизировать по скорости. И?

Зашаренный класс ресурсов использует меньше за счёт хранения указателей и открепления зашаренных данных

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

batbko
()
Ответ на: комментарий от batbko

Это, всего лишь, значит, что там нужно было оптимизировать по скорости. И?

Это всего лишь значит, что «лишние телодвижения» - это далеко не всегда оверхед. Иногда это серьёзная оптимизация.

Но по быстродействию это оверхед, вопрос только в том насколько он велик.

какой именно? Долго ещё ждать фактов?

И кстати, что же разработчики Qt те самые шаренные строки передают по константной ссылке там где это возможно?
Это можно было бы уточнить, но факт, что сами разработчики не пользуються этой оптимизацией чуть менее, чем нигде, должен наводить здравомыслящих людей на мысли.

Этой конструкцией пользуются абсолютно везде в foreach, а в методы по const ссылке передают просто по привычке и из-за идеологических соображений - переданная по значению строка может быть изменена внутри метода, что будет логической ошибкой. Тебе даже это надо объяснять?

alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov

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

по const ссылке передают просто по привычке

Это ты, может быть, что то делаешь просто по привычке, а обычно, люди делают что то, с какой то целью.

Behind the scenes, QString uses implicit sharing (copy-on-write) to reduce memory usage and to avoid the needless copying of data. This also helps reduce the inherent overhead of storing 16-bit characters instead of 8-bit characters.

Краткая выжимка из документации. Для чайников.

QString makes a deep copy of the QChar data, so you can modify it later without experiencing side effects. (If for performance reasons you don't want to take a deep copy of the character data, use QString::fromRawData() instead.)

Или как то так...

Т.е. этот класс есть, он несет некий оверхед по сравнению например с QByteArray или std::string. О чем разработчики, честно предупреждают. Так же, обоснованно появление этого оверхеда, и то, что для основных целей фреймворка - он не критичен и являеться разумной ценой, например за легкость интернациолизации.

batbko
()
Ответ на: комментарий от batbko

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

То есть утверждаешь что-то об оверхеде ты, а факты должен приводить я?

Краткая выжимка из документации. Для чайников.

при чём тут это? При использовании зашареного объекта по значению неважно сколько байт на символ отводится у него внутри, потому что они не копируются, хоть 8 бит, хоть 16.

QString makes a deep copy of the QChar data
Или как то так...

при чём тут вообще эти цитаты из доки по конструктору QString(const QChar*,int)? Какое отношение это имеет к зашаренности класса и к передаче по const ссылке? Ты вообще соображаешь что копируешь сюда, или нет?

Где факты оверхеда зашаренности, сколько ещё просить?

он несет некий оверхед по сравнению например с QByteArray или std::string

Дебил, QByteArray тоже зашарен, смотри http://qt-project.org/doc/qt-4.8/implicit-sharing.html#list-of-classes во впервых, и во-вторых в аналогичном конструкторе QByteArray(const char *, int) он тоже делает deep copy, поэтому поведение тут абсолютно одинаковое. А std::string делает deep copy в любом случае, в независимости от конструктора http://www.cplusplus.com/reference/string/string/string .

alex_custov ★★★★★
()
Последнее исправление: alex_custov (всего исправлений: 1)
Ответ на: комментарий от alex_custov

Нервная некомпетентная истеричка перешла на личности - пора сворачивать беседу :)
Ибо как вещает философ Ъ.

batbko
()
Ответ на: комментарий от alex_custov

Но, справедливости ради, надо заметить - с deep copy, ты прав. Тут я оплошал :(

batbko
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.