Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Timer ses méthodes [ Divers / Aide et documentation ] (seareal)

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é 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 Probleme sur Applet image [ par flolag ] Salut,J'ai creer un applet de redimensionnement d'image. Cela marche bien mais à un petit details près. Dans mon applet on selectionne le fichier à re Pb de connexion à un serveur ftp [ par mimi1255 ] Bonjour, j'ai un problème avec mon code pour me connecter au serveur ftp, voici l'erreur:java.net.MalformedURLException: unknown protocol: ftp://127.0 probleme d inser le contenu de JTextField dans un tableau [ par fatimazahrazaidi ] salut,jai fait un programme pour enregistres un contenu de JTextField  dans un tableu mais le message [Microsoft][Pilote ODBC Microsoft Access] Trop p Ouvrir un fichier video avec son logiciel par defaut [ par dreamnos ] Bonjour,Je suis débutant et je cherche a ouvrir un fichier vidéo avec son logiciel par défaut sur windows. Mon code ouvre bien des fichiers image, des [JXL] Problème avec setBackGround [ par Mede12 ] Bonjour,J'ai commencé le Java il y a 1 mois environ,  j'ai appris par mes propres moyen ( en particulier avec des tutoriels trouvés sur internet notam Visionner des images JAVA [ par punisher999 ] Bonjours, ce que je voudrais faire est peut-être simple mais ne l'ai pas pour moi. Je veux que mon interface ressemble à cela (en ce moment elle lui faire un import sur une librairie [ par fidji ] voila je débute (en java) et je voulais utiliser le port LPT1 (oui oui il est encore utilisé)voila alors après une bonne recherche j'ai trouvé ce qu'i class path [ par casporov ] salut. j'ai le code  suivant :package sockettest;import java.io.*;import java.net.Socket;import java.util.*;import java.net.*;public class SocketTes


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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
Temps d'éxécution de la page : 0,312 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.