begin process at 2012 02 12 17:20:38
  Trouver un code source :
 
dans
 
Accueil > Forum > 

JAVA / J2EE / J2ME

 > 

Divers

 > 

Aide et documentation

 > 

Timer ses méthodes


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Timer ses méthodes

vendredi 20 juillet 2007 à 17:39:54 | Timer ses méthodes

seareal

Bonsoir, je recherche un moyen de timer toutes les méthodes d'un programme sans pour autant les modifier à la main une à une.

J'ai essayé en utilisant BCEL (en adaptant un peu un code chinois), cela fonctionne bien sauf sur les méthodes contenant des "try - catch".
Si vous connaissez un moyen pour régler ce problème (ou un autre système), je vous en serais éterneeeeeeellement reconnaissant

Voilà le code de l'agent que j'utilise actuellement. Fonctionne bien sauf si une classe possède un code du genre
try
{
   // instruction non vide
}
catch (Exception e) {}

--------------------------------------------------------------------

import

java.io.ByteArrayInputStream;

import

java.io.ByteArrayOutputStream;

import

java.io.InputStream;

import

java.lang.instrument.ClassFileTransformer;

import

java.lang.instrument.IllegalClassFormatException;

import

java.lang.instrument.Instrumentation;

import

java.security.ProtectionDomain;

import

org.apache.bcel.Constants;

import

org.apache.bcel.classfile.ClassParser;

import

org.apache.bcel.classfile.JavaClass;

import

org.apache.bcel.classfile.Method;

import

org.apache.bcel.generic.ClassGen;

import

org.apache.bcel.generic.ConstantPoolGen;

import

org.apache.bcel.generic.InstructionConstants;

import

org.apache.bcel.generic.InstructionFactory;

import

org.apache.bcel.generic.InstructionList;

import

org.apache.bcel.generic.MethodGen;

import

org.apache.bcel.generic.ObjectType;

import

org.apache.bcel.generic.PUSH;

import

org.apache.bcel.generic.Type;

 

/**

*Classréécrivant

*/

public

class Timer implements ClassFileTransformer

{

privatestaticfinal String EXT_NAME = "_copie";

publicbyte[] transform(ClassLoader loader, String className, Class cBR,

ProtectionDomain pD,

byte[] classfileBuffer)

throws IllegalClassFormatException

{

try

{

// Charge la classe courante

String classFileName = className +

".class";

InputStream is = Timer.

class.getClassLoader().getResourceAsStream(classFileName);

JavaClass jclass =

new ClassParser(is, classFileName).parse();

// Initialise le ClassGen

ClassGen cgen =

new ClassGen(jclass);

// Ajoute le timer pour chaque méthode de la classe

Method[] methods = jclass.getMethods();

for (int index = 0; index < methods.length; index++)

{

try

{

// Pas de timer sur constructeur (... pour le moment !)

if (!methods[index].getName().equals("<init>"))

addTimer(cgen, methods[index]);

}

catch (Exception e) {e.printStackTrace();}

}

// Renvoie le code la classe

ByteArrayOutputStream bos =

new ByteArrayOutputStream();

cgen.getJavaClass().dump(bos);

return bos.toByteArray();

}

catch (Exception e)

{

e.printStackTrace();

}

returnnull;

}

privatestaticvoid addTimer(ClassGen cgen, Method method)

{

// ----------------- DES INITIALISATIONS...

InstructionFactory ifact =

new InstructionFactory(cgen);

InstructionList ilist =

new InstructionList();

ConstantPoolGen pgen = cgen.getConstantPool();

String cname = cgen.getClassName();

MethodGen wrapgen =

new MethodGen(method, cname, pgen);

wrapgen.setInstructionList(ilist);

// ----------------- RENOMME LA METHODE ORIGINALE

// Méthode à modifier

MethodGen methgen =

new MethodGen(method, cname, pgen);

// Suppression de la méthode

cgen.removeMethod(method);

String iname = methgen.getName() +

EXT_NAME;

methgen.setName(iname);

// Ajout de la méhode, renommée

cgen.addMethod(methgen.getMethod());

// ----------------- PREPARE LA NOUVELLE METHODE

// Type de retour de la méthode

Type result = methgen.getReturnType();

// Paramètres de la méthode

Type[] parameters = methgen.getArgumentTypes();

int stackIndex = methgen.isStatic() ? 0 : 1;

for (int i = 0; i < parameters.length; i++)

stackIndex += parameters[i].getSize();

// Enregistre le temps au début de la méthode

ilist.append(ifact.createInvoke(

"java.lang.System","currentTimeMillis", Type.LONG, Type.NO_ARGS, Constants.INVOKESTATIC));

ilist.append(InstructionFactory.createStore(Type.

LONG, stackIndex));

// Méthode static ou non TODO Voir pour constructeurs ici

int offset = 0;

short invoke = Constants.INVOKESTATIC;

if (!methgen.isStatic())

{

ilist.append(InstructionFactory.createLoad(Type.

OBJECT, 0));

offset = 1;

invoke = Constants.

INVOKEVIRTUAL;

}

// Les paramètres

for (int i = 0; i < parameters.length; i++)

{

Type type = parameters[i];

ilist.append(InstructionFactory.createLoad(type, offset));

offset += type.getSize();

}

// Signature de la méthode

ilist.append(ifact.createInvoke(cname, iname, result, parameters, invoke));

// ???

if (result != Type.VOID)

ilist.append(InstructionFactory.createStore(result, stackIndex+2));

// ----------------- AFFICHAGE DU TEMPS ECOULE

ilist.append(ifact.createFieldAccess(

"java.lang.System",

"out", new ObjectType("java.io.PrintStream"),

Constants.

GETSTATIC));

ilist.append(InstructionConstants.

DUP);

ilist.append(InstructionConstants.

DUP);

String text = cgen.getClassName() +

"\t"+ methgen.getName() +"\t";

ilist.append(

new PUSH(pgen, text));

ilist.append(ifact.createInvoke(

"java.io.PrintStream",

"print", Type.VOID, new Type[] { Type.STRING },

Constants.

INVOKEVIRTUAL));

ilist.append(ifact.createInvoke(

"java.lang.System",

"currentTimeMillis", Type.LONG, Type.NO_ARGS,

Constants.

INVOKESTATIC));

ilist.append(InstructionFactory.

createLoad(Type.

LONG, stackIndex));

ilist.append(InstructionConstants.

LSUB);

ilist.append(ifact.createInvoke(

"java.io.PrintStream",

"print", Type.VOID, new Type[] { Type.LONG },

Constants.

INVOKEVIRTUAL));

ilist.append(

new PUSH(pgen, " ms."));

ilist.append(ifact.createInvoke(

"java.io.PrintStream",

"println", Type.VOID, new Type[] { Type.STRING },

Constants.

INVOKEVIRTUAL));

// ----------------- RENVOI LE RETOUR DE LA METHODE ORIGINALE

if (result != Type.VOID)

ilist.append(InstructionFactory.createLoad(result, stackIndex+2));

ilist.append(InstructionFactory.createReturn(result));

// ----------------- POUR FINIR...

wrapgen.stripAttributes(

true);

wrapgen.setMaxStack();

wrapgen.setMaxLocals();

cgen.addMethod(wrapgen.getMethod());

ilist.dispose();

}

/**

*Correspondau"Main"del'agent.Utiliserl'appel:<br />

*java-javaagent:test.jarpackage.MainClass

*@paramoptions

*@paramins

*/

publicstaticvoid premain(String options, Instrumentation ins)

{

ins.addTransformer(

new Timer());

}

}

vendredi 20 juillet 2007 à 20:16:59 | Re : Timer ses méthodes

DARKSIDIOUS

Membre Club Administrateur CodeS-SourceS
Utilise un outil de profilling, ils sont fait pour mesurer le temps passé dans les méthodes pour savoir où est-ce qu'il faut optimiser.

Perso j'utilise JProfiler


lundi 23 juillet 2007 à 14:43:29 | Re : Timer ses méthodes

seareal

Merci pour ta réponse, je connaissais déjà JProfiler.
J'aurais été content de pouvoir faire marcher cela m'enfin tant pis.



Cette discussion est classée dans : java, type, import, append, ilist


Répondre à ce message

Sujets en rapport avec ce message

conversion au type Process?????? [ par merioma ] salut;voilà un programme qui filtre des chemins spécifiés pour avoir les fichiers (.exe), le résultat du filtre se met dans un vecteur ,je veux conver un erreur en java [ par mimazeft ] bonjour; voila la classe qui me donne l'erreur "Uncaught error fetching image: java.lang.NullPointerException": /************************************ boite de dialogue impression selon la langue choisie [ par raadamos ] Bonjour, J'ai developé une petite application qui doit afficher la boite de dialogue d'impression en français ou en anglais selon la langue choisie. filtrer un jtable en java [ par fazghol ] voici le code source de récupération de donnés d'une bd oracle dans une jtable java, l'exécution de cette dernière est effectuer mais lorsque je veux Encryption AES et RSA [ par masterbeta ] Bonjour! J'ai le code suivant:(encryption AES 128b) package ca.umontreal.ift2830.security; import java.io.FileInputStream; import java.io.FileNotFou récupérer l'adresse mac en java [ par atouihichem ] salut tout le monde, je cherche comment trouver le mac d'un autre poste sur le réseau local avec java j'essaye avec un programme mais il renvoi que le Moteur de recherche en java [ par billouxs ] Bonjour a tous , je souhaiterai cre?er un robot qui parcourera récursivement sur N niveaux, une liste d'URL donné en initialisation du programme. Mer ireport vers java vers un pdf [ par bou71989 ] salut tout le monde je suis en train de faire une application crm avec eclipse et oracle 10g et il faut faire des etats "facture" donc jai utilisé le Aide moteur de recherche en JAVA [ par billouxs ] Bonjour a tous ,j'espere avoir poster dans la bonne section ! Donc voila je dois réaliser un mini moteur de recherche avec un dictionnaire ,j'arrive a Probleme applet Java [ par chiro2000 ] Bonjour a tous J ai souci avec ma classe suivante. Mon but est dessiner la carte correspondant au fichier passe en parametre(data.tx) import java


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,309 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales