[Ответ на мой собственный вопрос]
лучшие введения, которые я нашел до сих пор, являются главой 10, "Статическое Метапрограммирование в C++" от Порождающее Программирование, Методы, Инструменты и Приложения Krzysztof Czarnecki и Ulrich W. Eisenecker, ISBN-13: 9780201309775; и глава 17, "Метапрограммы" Шаблоны C++: полное руководство David Vandevoorder и Nicolai M. Josuttis, ISBN-13: 9780201734843.
у Todd Veldhuizen есть превосходное учебное руководство здесь .
А хороший ресурс для программирования на C++ в целом современный Дизайн C++ Andrei Alexandrescu, ISBN-13: 9780201704310. Эта книга смешивает немного метапрограммирования с другими шаблонными методами. Для метапрограммирования в частности, посмотрите разделы 2.1 "Утверждения Времени компиляции", 2.4 "Отображающихся Интегральных Константы к Типам", 2.6 "Выбора типа", 2,7 "Обратимости обнаружения и Наследование во время компиляции", 2.9" NullType
и EmptyType
" и 2.10 "Черты Типа".
лучший промежуточный/усовершенствованный ресурс, который я нашел, Шаблонное Метапрограммирование C++ David Abrahams и Aleksey Gurtovoy, ISBN-13: 9780321227256
, Если Вы предпочли бы всего одну книгу, доберитесь Шаблоны C++: полное руководство , так как это - также категорическая ссылка для шаблонов в целом.
Просто сделайте снимок результатов профилирования. Здесь вы увидите время настенных часов и собственное время.
you could use a
long startTime = System.currentTimeMillis();
at the beggining
and
long endTime = System.currentTimeMillis();
and finally to get the result
long result = endTime - startTime; //Note, part might be backwards, I don't
//Remember
Есть простой способ получить общее время процедуры в процентах от стены- время выполнения часов (а не миллисекунды). Просто используйте ctrl-break, чтобы получить кучу стекшотов, пока вы этого ждете. Доля из них, содержащих рутину, - это процент времени, который она занимает. Точность зависит от того, сколько выстрелов вы сделаете. Если вы просто ищете причину проблем, вам не нужно точное измерение времени. Вот ' краткое объяснение того, как это работает.
JavaAssist - это библиотека классов для управления вашим байтовым кодом Java, не касаясь источника. Возьмем пример измерения время, необходимое для выполнения метода.
public class Subject {
/**
* Timetaken for start & end of the method
*
* @throws InterruptedException
*/
public void method2() throws InterruptedException {
// Some business logic :)
Thread.sleep(2000);
}
}
Чтобы измерить время, затраченное на выполнение subject.method2 ()
, вы можете улучшить Subject.methods ()
, добавив начало и конец кода метода, как показано.
public class JavaAssist {
public static void main(String[] args) {
timeTaken();
}
public static void timeTaken() {
try {
ClassPool p = ClassPool.getDefault();
CtClass cc = p.get("Subject");
CtMethod meth2 = cc.getDeclaredMethod("method2");
meth2.insertBefore("System.out.println(\" Start : \"+new java.util.Date());");
meth2.insertAfter("System.out.println(\" End : \"+new java.util.Date());");
// cc.writeFile(".");
Class c = cc.toClass();
Subject s = (Subject) c.newInstance();
s.method2();
cc.detach();
} catch (Exception e) {
// suppressed
}
}
}
Вывод: Начало: среда, 26 мая, 17:24:18 EDT 2010 Конец: среда, 26 мая, 17:24:20 EDT 2010
Ссылка http://www.csg.is.titech.ac.jp/~chiba/javassist/tutorial/tutorial.html#read
http://www.csg.is.titech.ac.jp/ ~ chiba / javassist / html /
Источник Сообщение от: http://www.senthilb.com/2010/05/javaassist-byte-code-enhancement.html