Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Advanced Developers Conference     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: Java ::  Zusammehang der Geschwindikeit mit Windows-Version?     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
FaceToFace
Unregistrierter




Beitrag FaceToFace Unregistrierter 20:04:42 09.02.2010   Titel:   Zusammehang der Geschwindikeit mit Windows-Version?            Zitieren

Grüß Gott.
Ich habe ein Programm geschrieben, dass die Pixelfarbe von Pixeln in einem bestimmten Bereich ermittelt und diese dann in einem Fenster zeichnet. Sozusagen ein kleiner Screenshot.

Nur ich habenun eine sehr seltsame Erfahrung gemacht:
Bei Windows XP(Pentium 4 3,0 Ghz, 1 GB Ram) dauert der Vorgng ca 30 Sekunden
Bei Windows Vista 32Bit, 2 GB RAM, 1,8GHz Core2Duo - 239304 milliseconds ~4min
Bei Windows 7 64-Bit, 4 GB RAM, 2,7 GHz Core i5 - 323250ms rund 5 Minuten

Da kann doch rgendetwas nicht stimmen?
Hier mal der Code.
Wäre auch gut wen ihr eure Ergebnisse + System posten könntet
Java Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import java.awt.*;
/**
 * Beschreiben Sie hier die Klasse Test.
 *
 * @author (Ihr Name)
 * @version (eine Versionsnummer oder ein Datum)
 */

class CrappyDrawTest extends Frame
{
 public static void main(String[] args)
    {
        CrappyDrawTest t = new CrappyDrawTest();
    }
 
    CrappyDrawTest()
            {
 
            super("Kleiner Screen");
            setLayout(new FlowLayout());
            setSize(200,400);
            setLocation(200,100);
            getMinimumSize();
            this.setVisible(true);
           }
 
   public void paint(Graphics g)
   {
       long t0 = System.currentTimeMillis();
       try
        {
            //Ermitteln der Pixelfarbe
            Robot rob = new Robot();                
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
        int x = 1, y = 15;
        while(y <= 400)
        {
            long te = System.currentTimeMillis();
            try
            {
                //Ermitteln der Pixelfarbe
                Robot rob = new Robot();
                Color clr = rob.getPixelColor(x, y);
               
                g.setColor(clr);
            }
            catch(Exception e)
            {
                System.out.println(e);
            }
            //Zeichnen
            g.fillRect(x,y, 1, 1);
            x++;
            if(x > 30)
            {
                y++;
                x=1;
            }
            long dif = System.currentTimeMillis() - te;
            System.out.println("Dieser Pixel dauerte " + dif + "ms");
        }
        System.out.println( "paint finished in " + (System.currentTimeMillis()-t0) + "ms");
    }
}
Java Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import java.awt.*;
/**
* Beschreiben Sie hier die Klasse Test.
*
* @author (Ihr Name)
* @version (eine Versionsnummer oder ein Datum)
*/

class CrappyDrawTest extends Frame
{
public static void main(String[] args)
{
CrappyDrawTest t = new CrappyDrawTest();
}

CrappyDrawTest()
{

super("Kleiner Screen");
setLayout(new FlowLayout());
setSize(200,400);
setLocation(200,100);
getMinimumSize();
this.setVisible(true);
}

public void paint(Graphics g)
{
long t0 = System.currentTimeMillis();
try
{
//Ermitteln der Pixelfarbe
Robot rob = new Robot();
}
catch(Exception e)
{
System.out.println(e);
}
int x = 1, y = 15;
while(y <= 400)
{
long te = System.currentTimeMillis();
try
{
//Ermitteln der Pixelfarbe
Robot rob = new Robot();
Color clr = rob.getPixelColor(x, y);

g.setColor(clr);
}
catch(Exception e)
{
System.out.println(e);
}
//Zeichnen
g.fillRect(x,y, 1, 1);
x++;
if(x > 30)
{
y++;
x=1;
}
long dif = System.currentTimeMillis() - te;
System.out.println("Dieser Pixel dauerte " + dif + "ms");
}
System.out.println( "paint finished in " + (System.currentTimeMillis()-t0) + "ms");
}
}
Java Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import java.awt.*;
/**
 * Beschreiben Sie hier die Klasse Test.
 *
 * @author (Ihr Name)
 * @version (eine Versionsnummer oder ein Datum)
 */

class CrappyDrawTest extends Frame
{
 public static void main(String[] args)
    {
        CrappyDrawTest t = new CrappyDrawTest();
    }
 
    CrappyDrawTest()
            {
 
            super("Kleiner Screen");
            setLayout(new FlowLayout());
            setSize(200,400);
            setLocation(200,100);
            getMinimumSize();
            this.setVisible(true);
           }
 
   public void paint(Graphics g)
   {
       long t0 = System.currentTimeMillis();
       try
        {
            //Ermitteln der Pixelfarbe
            Robot rob = new Robot();                
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
        int x = 1, y = 15;
        while(y <= 400)
        {
            long te = System.currentTimeMillis();
            try
            {
                //Ermitteln der Pixelfarbe
                Robot rob = new Robot();
                Color clr = rob.getPixelColor(x, y);
               
                g.setColor(clr);
            }
            catch(Exception e)
            {
                System.out.println(e);
            }
            //Zeichnen
            g.fillRect(x,y, 1, 1);
            x++;
            if(x > 30)
            {
                y++;
                x=1;
            }
            long dif = System.currentTimeMillis() - te;
            System.out.println("Dieser Pixel dauerte " + dif + "ms");
        }
        System.out.println( "paint finished in " + (System.currentTimeMillis()-t0) + "ms");
    }
}


Programm wurde inBlueJ, Eclipse und als JAR gestartet.

bitte um eu Hilfe

mfg Face
Rhombicosidodecahedron
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.08.2006
Beiträge: 837
Beitrag Rhombicosidodecahedron Mitglied 21:35:28 09.02.2010   Titel:   Re: Zusammehang der Geschwindikeit mit Windows-Version?            Zitieren

Ich habe zwar keine Zahlen dafür in paar Kommentarezum Quelltext


Der Code ist deswegen so lahm da du du beim Setzen jedes Pixels einzelnd die Dauer ausgibst und das ist wahrschinlich das was am meisten Zeit benötigt.

FaceToFace schrieb:

Java Code:
class CrappyDrawTest
Java Code:
class CrappyDrawTest
Java Code:
class CrappyDrawTest
Stimmt sehr Crappy :rolleyes:

FaceToFace schrieb:
Java Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
6
7
8
9
10
11
12
13
   public void paint(Graphics g)
   {
       /*   ...   */
       try
        {
            //Ermitteln der Pixelfarbe
            Robot rob = new Robot();                
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
/*  ...   */
Java Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
public void paint(Graphics g)
{
/* ... */
try
{
//Ermitteln der Pixelfarbe
Robot rob = new Robot();
}
catch(Exception e)
{
System.out.println(e);
}
/* ... */
Java Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
   public void paint(Graphics g)
   {
       /*   ...   */
       try
        {
            //Ermitteln der Pixelfarbe
            Robot rob = new Robot();                
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
/*  ...   */
Wozu der Code am Anfang ???? Der hat doch gar keine Funktion

FaceToFace schrieb:
Java Code:
        int x = 1, y = 15;
        while(y <= 400)
Java Code:
int x = 1, y = 15;
while(y <= 400)
Java Code:
        int x = 1, y = 15;
        while(y <= 400)
For-Schleife???


FaceToFace schrieb:
Java Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
            long te = System.currentTimeMillis();
            try
            {
                //Ermitteln der Pixelfarbe
                Robot rob = new Robot();
                Color clr = rob.getPixelColor(x, y);
               
                g.setColor(clr);
            }
            catch(Exception e)
            {
                System.out.println(e);
            }
            //Zeichnen
            g.fillRect(x,y, 1, 1);
            x++;
            if(x > 30)
            {
                y++;
                x=1;
            }
}
Java Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
long te = System.currentTimeMillis();
try
{
//Ermitteln der Pixelfarbe
Robot rob = new Robot();
Color clr = rob.getPixelColor(x, y);

g.setColor(clr);
}
catch(Exception e)
{
System.out.println(e);
}
//Zeichnen
g.fillRect(x,y, 1, 1);
x++;
if(x > 30)
{
y++;
x=1;
}
}
Java Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
            long te = System.currentTimeMillis();
            try
            {
                //Ermitteln der Pixelfarbe
                Robot rob = new Robot();
                Color clr = rob.getPixelColor(x, y);
               
                g.setColor(clr);
            }
            catch(Exception e)
            {
                System.out.println(e);
            }
            //Zeichnen
            g.fillRect(x,y, 1, 1);
            x++;
            if(x > 30)
            {
                y++;
                x=1;
            }
}
Warum erstellst du den Robot innerhalb der WhileSchife immer neu?

_________________
Gödelscher Unvollständigkeitssatz: Ein [mathematisches] System kann nicht zum Beweis seiner eigenen Widerspruchsfreiheit verwendet werden.
Rhomsche Schlussfolgerung: Ein Betriebssystem kann nicht zum Beweis seiner eigenen Virenfreiheit benutzt werden.
FaceToFace
Unregistrierter




Beitrag FaceToFace Unregistrierter 21:53:35 09.02.2010   Titel:              Zitieren

Habe den Code noch etwas verändert gehabt,aber den falschen reinkopiert:
Java Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 import java.awt.*;
/**
 * Beschreiben Sie hier die Klasse Test.
 *
 * @author (Ihr Name)
 * @version (eine Versionsnummer oder ein Datum)
 */

class CrappyDrawTest extends Frame
{
 public static void main(String[] args)
    {
        CrappyDrawTest t = new CrappyDrawTest();
    }
 
    CrappyDrawTest()
            {
 
            super("Kleiner Screen");
            setLayout(new FlowLayout());
            setSize(200,400);
            setLocation(200,100);
            getMinimumSize();
            this.setVisible(true);
           }
 
   public void paint(Graphics g)
   {
       long t0 = System.currentTimeMillis();
       Robot rob = null;
       try
        {
            //Ermitteln der Pixelfarbe
            rob = new Robot();                
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
        int x = 1, y = 15;
        while(y <= 400)
        {
            long te = System.currentTimeMillis();
            Color clr = rob.getPixelColor(x, y);
            g.setColor(clr);
            //Zeichnen
            g.fillRect(x,y, 1, 1);
            x++;
            if(x > 30)
            {
                y++;
                x=1;
            }
            long dif = System.currentTimeMillis() - te;
            System.out.println("Dieser Pixel dauerte " + dif + "ms");
        }
        System.out.println( "paint finished in " + (System.currentTimeMillis()-t0) + "ms");
    }
}
Java Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import java.awt.*;
/**
* Beschreiben Sie hier die Klasse Test.
*
* @author (Ihr Name)
* @version (eine Versionsnummer oder ein Datum)
*/

class CrappyDrawTest extends Frame
{
public static void main(String[] args)
{
CrappyDrawTest t = new CrappyDrawTest();
}

CrappyDrawTest()
{

super("Kleiner Screen");
setLayout(new FlowLayout());
setSize(200,400);
setLocation(200,100);
getMinimumSize();
this.setVisible(true);
}

public void paint(Graphics g)
{
long t0 = System.currentTimeMillis();
Robot rob = null;
try
{
//Ermitteln der Pixelfarbe
rob = new Robot();
}
catch(Exception e)
{
System.out.println(e);
}
int x = 1, y = 15;
while(y <= 400)
{
long te = System.currentTimeMillis();
Color clr = rob.getPixelColor(x, y);
g.setColor(clr);
//Zeichnen
g.fillRect(x,y, 1, 1);
x++;
if(x > 30)
{
y++;
x=1;
}
long dif = System.currentTimeMillis() - te;
System.out.println("Dieser Pixel dauerte " + dif + "ms");
}
System.out.println( "paint finished in " + (System.currentTimeMillis()-t0) + "ms");
}
}
Java Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 import java.awt.*;
/**
 * Beschreiben Sie hier die Klasse Test.
 *
 * @author (Ihr Name)
 * @version (eine Versionsnummer oder ein Datum)
 */

class CrappyDrawTest extends Frame
{
 public static void main(String[] args)
    {
        CrappyDrawTest t = new CrappyDrawTest();
    }
 
    CrappyDrawTest()
            {
 
            super("Kleiner Screen");
            setLayout(new FlowLayout());
            setSize(200,400);
            setLocation(200,100);
            getMinimumSize();
            this.setVisible(true);
           }
 
   public void paint(Graphics g)
   {
       long t0 = System.currentTimeMillis();
       Robot rob = null;
       try
        {
            //Ermitteln der Pixelfarbe
            rob = new Robot();                
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
        int x = 1, y = 15;
        while(y <= 400)
        {
            long te = System.currentTimeMillis();
            Color clr = rob.getPixelColor(x, y);
            g.setColor(clr);
            //Zeichnen
            g.fillRect(x,y, 1, 1);
            x++;
            if(x > 30)
            {
                y++;
                x=1;
            }
            long dif = System.currentTimeMillis() - te;
            System.out.println("Dieser Pixel dauerte " + dif + "ms");
        }
        System.out.println( "paint finished in " + (System.currentTimeMillis()-t0) + "ms");
    }
}


Aber wieso sllte ich ein for-Schleife machen? Ich weiß sie ist viel kompakter, aber st sie auch schneller? Ich wollte das ganze auch nicht umschreiben, kann ic aber auch machen.

mfg Face

P.S.: Der Cod am Anfang, war weil es am Anfang nicht funktioniet hat und ich wissen wollte ob es eine Exception gibt^^
byto
Mitglied

Benutzerprofil
Anmeldungsdatum: 21.08.2006
Beiträge: 1188
Beitrag byto Mitglied 09:33:52 10.02.2010   Titel:              Zitieren

1.) Lieber JFrame benutzen statt Frame. JFrame ist Swing (leichtgewichtig), während Frame AWT ist (schwergewichtig).
2.) IdR niemals paint() überschreiben! Stattdessen paintComponent() überschreiben und dort die Zeichenlogik rein!
3.) Du solltest keine rechenintensiven Operationen in paintComponent() machen! Stattdessen Farben vorher auslesen und in paintComponent() nur noch zeichnen.
4.) Niemals nie System.out für zeitkritische Logik benutzen, schon gar nicht wenn Du die Ausführungszeit misst! Benutze stattdessen einen Logger wie log4j. Das ist deutlich performanter (kostet aber immernoch Zeit).
Dasd
Mitglied

Benutzerprofil
Anmeldungsdatum: 22.08.2003
Beiträge: 1036
Beitrag Dasd Mitglied 09:35:23 10.02.2010   Titel:              Zitieren

Dein Code braucht bei mir ca. 500ms. Aber warum so umständlich?

Java Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.awt.*;
import java.awt.image.BufferedImage;

class BetterDrawTest extends Frame {
   
    public static void main(String[] args) throws AWTException {
        new BetterDrawTest();
    }

    private final Robot rob;

    private BetterDrawTest() throws AWTException {
        super("Kleiner Screen");
       
        rob = new Robot();

        setBounds(200, 100, 200, 400);
        this.setVisible(true);
    }

    public void paint(Graphics g) {
        long t0 = System.currentTimeMillis();
        BufferedImage img = rob.createScreenCapture(
                new Rectangle(0, 0, 30,    400));
        g.drawImage(img, 30, 30, null);
        System.out.println("paint finished in "
                + (System.currentTimeMillis() - t0) + "ms");
    }
}
Java Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.awt.*;
import java.awt.image.BufferedImage;

class BetterDrawTest extends Frame {

public static void main(String[] args) throws AWTException {
new BetterDrawTest();
}

private final Robot rob;

private BetterDrawTest() throws AWTException {
super("Kleiner Screen");

rob = new Robot();

setBounds(200, 100, 200, 400);
this.setVisible(true);
}

public void paint(Graphics g) {
long t0 = System.currentTimeMillis();
BufferedImage img = rob.createScreenCapture(
new Rectangle(0, 0, 30, 400));
g.drawImage(img, 30, 30, null);
System.out.println("paint finished in "
+ (System.currentTimeMillis() - t0) + "ms");
}
}
Java Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.awt.*;
import java.awt.image.BufferedImage;

class BetterDrawTest extends Frame {
   
    public static void main(String[] args) throws AWTException {
        new BetterDrawTest();
    }

    private final Robot rob;

    private BetterDrawTest() throws AWTException {
        super("Kleiner Screen");
       
        rob = new Robot();

        setBounds(200, 100, 200, 400);
        this.setVisible(true);
    }

    public void paint(Graphics g) {
        long t0 = System.currentTimeMillis();
        BufferedImage img = rob.createScreenCapture(
                new Rectangle(0, 0, 30,    400));
        g.drawImage(img, 30, 30, null);
        System.out.println("paint finished in "
                + (System.currentTimeMillis() - t0) + "ms");
    }
}


Das braucht im schlechtesten Fall 15ms bei mir.
FaceToFace
Unregistrierter




Beitrag FaceToFace Unregistrierter 14:41:04 10.02.2010   Titel:              Zitieren

Weil ich etwas anderes noch nicht gelernt habe... und so habe ich probiert mir eine eigene "Screenshot-Methode" zu machen. Und dabei ist mir halt aufgefallen, dass es deutlich langsamer als auf XP geht.
Den Grund habe ich auch schon: Windows Aero. WEnn es deaktiviert ist benötigt der Code ca 500 ms.

Ist aber auch Blöd um das Programm zu starten extra Aero auszumachen.

Vielen Dank für eure Hilfe und ich werde eure Ratschläge natürlich versuchen in meinem Programm zu berücksichtigen.

Viele Grüße

P.S.: Gibt es eine Möglichkeit, dass wenn das Programm aufgerufen wird der Windows Style auf Klassisch gesetzt wird? Da ist Aero nämlich deaktiviert.
Zeus
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.09.2003
Beiträge: 2402
Beitrag Zeus Mitglied 15:44:22 10.02.2010   Titel:              Zitieren

Evtl neue JDK/JRE installieren, dein Code braucht bei mir 2000 ms auf Windows 7 mit Aero. Bei deutlich ältere Hardwareausstatung, AMD X2.
C/C++ Forum :: Java ::  Zusammehang der Geschwindikeit mit Windows-Version?   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.