CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[java] Lent mais dans quel sens?

PiloiCus
PiloiCus
Niveau 10
01 mai 2007 à 04:52:16

J´apprends le java depuis un ptit bout de temps et partout on dit que c´est un bon langage pour débuter la poo avant d´attaquer le c/c++ par exemple..
et partout aussi on dit que "c´est lent". Je pense comprendre à peu près l´idée qu´il faut traduire d´abord le code, ou l´interpréter en passant par la machine virtuelle ...mais je comprends toujours pas en fait ce que ca veut dire que "java est lent"

Si quelqu´un pouvait m´éclairer :svp:

Iinux
Iinux
Niveau 2
01 mai 2007 à 09:12:10

Eh bien pour certaines choses avec deux programmes faisant la même chose l´un en java l´autre en cpp et bien celui en java mettra plus de temps à tout faire que celui en cpp :-)))

godrik
godrik
Niveau 30
01 mai 2007 à 10:14:41

il y a plusieurs choses. Mais commencons par rappeler que l´on a pas inventer java pour etre perforamnt. Et qu´il est normal qu´il soit lent.

D´abors java est interprete du byte code au lancement. ce qui veut dire qu´auchargement d´un code jamais utilisé, il va y avoir une passe d´interpretation. On ne doit payer ce cout la qu´une seule fois.

Java vérifie automatiquemlent la taille de tout tes tableaux pour vérifier que l´on ne fait pas d´access en dehors. Cela provoque deux choses. 1: Java note la taille des tableaux et si c´est inutile, on perd un entier par tableau. 2: a chaque access a un tableau, java fait une comparaison pour vérifier que l´on est dans les bornes du tableau. Notons que ce deuxieme point doit etre optimiser pour ne pas revérifier si la valeur acceder n´a pas changer.

Java abstrait la mémoire du développeur. Ainsi le developpeur n´a aucune idée du placement mémoire de ses données. Il est donc impossible d´assurer de la proximité de donnée étant utiliser en meme temps. Cela peut provoquer des défaults de cache important. Sur les machines NUMA (Non-uniform Memory Access), ne pas avoir access au placement des données est un probleme crucial de performances!!

Java dispose d´un mecanisme de garbage collection. Ce qui ne permet pas a l´utilisateur de réutiliser de l´espace mémoire pour faire autre chose. De meme, on ne sait pas quand le garbage collector passera, donc, on peut potentiellement avoir une consommation mémoire bien plus importante qu´elle ne devrait l´etre. Ceci peut entrainer des défault de cache, voir du swap sur disque dur.

Java abstrait completement la machine sur laquelle on travaille. Il est donc difficile d´utiliser des mecanisme propres a certaines architecture (vectorialisation, coprocesseur de je ne sais quoi). On peut soit faire confiance a l´interpreteur; mon experience des compilateurs me dit que c´est une mauvaise idée. Soit exporter le traitemnet dans un module séparé qui sera écrit dans un autre langage, rendantle code probablement plus difficile a maintenir.

De facon plus général sur la compilation a la volé. Du fait que c´est compiler à la volée, on donne assez peut d´information sur les niveau d´optimisation du code, on risque de se retrouver avec certains bout de code qui sont tres gros (unroll loop, ce genre de chose) mais qui sont peu utilisé, donc défault de page plus fréquent dans les zones non critique. Qui du coup pourrait bien devenir critique.

Il y a probablement d´autre argument pour dire que java est lent. Je n´en donne que quelques un ici. Peut etre que certain diront qu´ils ont obtenu de meilleur performance avec du java qu´avec du C. Je demanderai a verifier les conditions expérimentales; tous les tests que j´ai vu jusqu´a présent étaient fortement biaisé.

Finalement, il est normal que java soit "lent"; il a été pensé pour etre multi-plateforme et ca ne fait pas bon ménage avec de la performance.

PiloiCus
PiloiCus
Niveau 10
02 mai 2007 à 00:37:39

merci pour la réponse godrik

ps: j´avais pas pensé que le garbage collection était une mauvaise chose vu que comme ça on a pas à se débarasser de ce qu´on utilise plus manuellement

JujuDredd
JujuDredd
Niveau 10
04 mai 2007 à 14:29:58

J´a va pas très vite...

Fvirtman
Fvirtman
Niveau 10
04 mai 2007 à 16:38:51

Ah ! Des jeux de mots, je suis !!

Java pas du tout.
Java-le.
Java pas vu.

godrik
godrik
Niveau 30
04 mai 2007 à 16:56:56

puisque le serieux de ce forum est mis a l´epreuve:

si java bien c´est java bean!

Fvirtman
Fvirtman
Niveau 10
04 mai 2007 à 17:17:09

"Lent mais dans quel sens"

Et bien :

Lent-erne
Lent-ille
Lent-eur
Lent-tropophage
Lent-tropopiteque
Lent-dicapé (sujet qui fait gueuler Ségo NDLR)
Lent-tropie
Lent-tipathie
Lent-merdeur
Lent-bobineur
Lent-ragé

Y´en a trop...

godrik
godrik
Niveau 30
04 mai 2007 à 17:29:05

d´ailleurs, nous somme en lent 2007.

JujuDredd
JujuDredd
Niveau 10
05 mai 2007 à 02:24:52

:desole: C´est un peu de ma faute quand même... :honte:

PiloiCus
PiloiCus
Niveau 10
05 mai 2007 à 02:38:33

même-oire d´une geisha (0.o)

J´essaie de faire du double-buff en utilisant un thread (marche a suivre traditionnelle)
voici un bout du code
public void run() {
while(i!=100) {
try {
Thread.sleep(10);
} catch (Exception e){
}
i++;
this.repaint();
}
}

public void paint(Graphics g) {

Graphics2D g2d = (Graphics2D) g;
bufferG.setColor(new Color(255,255,255));
bufferG.fillRect(0,0,400,400);
bufferG.setPaint(new Color(200,100,215));
bufferG.fillRect(30+i, 30+i, 60+i,60+i);
g2d.drawImage(offscreen,0,0,this);
}

public static void main(String[] args) {
Test2 t2 = new Test2();
Thread th = new Thread(t2);
th.start();
}

4 fois sur 5 je vais avoir une erreur
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at la 2e ligne de paint().

j´ai essayé de me renseigne online sur l´erreur mais j´ai pas trouvé grand chose, quelqu´un saurait a quoi ca correspond?

godrik
godrik
Niveau 30
05 mai 2007 à 11:18:15

Il manque des informations.
met plus de code a disposition sur un wall rafb.net/paste par exemple.

L´erreur me semble relativement clair pourtant.
NullPointerException signifie que tu déréference une reference nulle. tu n´utilises a cette ligne que l´objet bufferG, j´en déduit qu´il n´a pas été crée.

novembre
novembre
Niveau 18
05 mai 2007 à 11:57:34

Sinon :

Thread.sleep(10);
} catch (Exception e){
}

A EVITER !
Toujours mettre au moins un message d´erreur, en cas de problème ca évite de chercher des heures.

PiloiCus
PiloiCus
Niveau 10
05 mai 2007 à 19:55:12

voila donc le début du code

public class Test2 extends JFrame implements Runnable {
int i;
Image offscreen;
Graphics2D bufferG;

public Test2() {
super("test2");
setBounds(0,0,400,400);
setVisible(true);
i=0;
//Cree l´image arrière plan sur laquelle on dessine
offscreen = createImage(400,400);
bufferG = (Graphics2D)offscreen.getGraphics();
}

sinon je vais essayer de mettre qqchose dans le catch

JujuDredd
JujuDredd
Niveau 10
29 mai 2007 à 12:33:46

J´ai quelques questions sur les programmes java mis dans un fichier .jar
En fait le .jar c´est bien pratique, et si on a installé Java, il suffit d´un double clic dessus pour l´exécuter.

Mais je suis loin d´être un expert alors j´ai quelques questions :
- Si un utilisateur a juste installé le rentime, voir-même le plugin java pour navigateur, est-ce qu´il va pouvoir exécuter les .jar comme ça ? (j´ai vraiment pas envie de désinstaller Java pour tester...)
- Est-ce qu´on peut mettre un fichier de donnée dans l´archive et le lire pendant l´exécution, ou est-ce que ça marchera pas et il faudra obligatoirement encapsuler mes données dans une classe ?

Pseudo supprimé
Pseudo supprimé 29 mai 2007 à 12:55:34

1] Oui
2] Oui

godrik
godrik
Niveau 30
29 mai 2007 à 13:12:59

comment fait on pour acceder a un fichier de donné dans le jar ?
Quel est son adresse dans le systeme de fichier ? Ou peut etre l´accede t´on differement.

JujuDredd
JujuDredd
Niveau 10
29 mai 2007 à 13:56:09

Oui, j´allais le demander :-)

JujuDredd
JujuDredd
Niveau 10
29 mai 2007 à 16:47:35

Bon, j´ai trouvé, faut utiliser un JarInputStream, j´ai fait un petit code d´exemple et je vous le mets au cas où quelqu´un d´autre soit intéressé :

/* fichier TestJarFiles.java */
import java.io.*;
import java.util.jar.*;
import java.awt.*;
import java.awt.event.*;

public class TestJarFiles extends java.applet.Applet
implements ActionListener, WindowListener
{
static final Color orangeClair = new Color(248,236,203);
static final Color orangeMoyen = new Color(246,212,175);
static final Color orangeFonce = new Color(255,187,153);

Font f = new Font("Helvetica",Font.PLAIN,15);

TextArea texte = new
TextArea("",0,0,TextArea.SCROLLBARS_VERTICAL_ONLY)
;

public void init()
{
setFont(f);

setBackground(orangeClair);
setForeground(Color.BLACK);

setLayout(null);

texte.setBounds(0,0,600,400);
texte.setEditable(false);
texte.setBackground(orangeMoyen);

try
{
JarInputStream jar = new JarInputStream(new FileInputStream("TestJarFiles.jar"));
JarEntry titre = jar.getNextJarEntry();
String toto = new String("toto.txt");
while (!titre.getName().equals(new String("toto.txt")))
{
titre = jar.getNextJarEntry();
}

String str = new String("");
int rd;
byte[] bytes = new byte[1];
while ((rd = jar.read()) >= 0)
{
bytes[0] = (byte)rd;
str = str.concat(new String(bytes));
}

texte.setText(str);
}
catch (Exception e)
{
texte.setText("Erreur...");
}

add(texte);
}

public void actionPerformed(ActionEvent e)
{
Object source = e.getSource();
}

public void update(Graphics g)
{
paint(g);
}

public void windowActivated(WindowEvent e)
{
}

public void windowClosed(WindowEvent e)
{
System.exit(0);
}

public void windowClosing(WindowEvent e)
{
System.exit(0);
}

public void windowDeactivated(WindowEvent e)
{
}

public void windowDeiconified(WindowEvent e)
{
}

public void windowIconified(WindowEvent e)
{
}

public void windowOpened(WindowEvent e)
{
}

public static void main(String[] args)
{
Frame frame = new Frame("Test d´un fichier jar");
TestJarFiles app = new TestJarFiles();

frame.setBackground(TestJarFiles.orangeClair);
frame.setLayout(new FlowLayout());
app.setSize(600,400);
frame.add(app);
app.init();
frame.pack();
frame.setResizable(false);
frame.addWindowListener(app);
frame.setVisible(true);
}
}
/* fin du fichier TestJarFiles.java */

/* Fichier toto.txt */
/* à enregistrer si possible au format texte UNIX */
Plouf !
Tombé dans l´eau...
/* fin du fichier toto.txt */

/* Fichier make.bat */
@cls
javac -Xlint:deprecation -Xlint:unchecked *.java
jar cvmf manifest.txt TestJarFiles.jar *.class toto.txt
del *.class
/* fin du fichier make.bat */
/* oui je compile comme ça moi... c´est quoi eclipse ? ^^*/

JujuDredd
JujuDredd
Niveau 10
29 mai 2007 à 16:58:54

Houla, je viens de me rendre compte que j´oublie de refermer les fichiers ouverts :honte:
En plus ma méthode pour lire le fichier octet par octet n´est certainement pas optimale.
Enfin c´est juste pour voir que ça marche...

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment