Java Lineare Suche

S

slitec

Mitglied
Hallo.


Ich habe einen Code geschrieben, der zeigen soll, wie schnell bzw. langsam sich eine lineare Suche verhält. Hierzu wird ein Array mit mit 1000 Plätzen durchsucht. Die eigentliche Suche geschieht zunächst 1000 mal, dann anschließend darauf folgend 30 mal. Beides mal wird ein Mittelwert am Ende gebildet.

Mir ist folgendes aufgefallen:
-je mehr Suchen ich starte, desto geringer wird dann die finale Suchzeit (also das Endergebnis nach den 1000 und 30 mal). Wenn ich jetzt z.B. für die erste innere Schleife eine Zahl von 10.000 und für die äußere 200 statt 1.000 und 30 eingebe, ist die suche laut meinem Code viel schneller als zuvor.
- Der Wert sollte sich doch eigentlich einpendeln und immer ungefähr das selbe anzeigen ?

Kann mir da jemand vielleicht erklären woran dies liegt ? Habe ich einen Fehler gemacht?


Java:
package A2;

import java.util.Random;
import java.util.Arrays;



public class LineareSuche {
    
    public int[] liste; //Array wird definiert als "liste"
    Random zufall = new Random();    // wird erzeugt für Klasse erzeugenUnsortiert()
    int suchzahl; //Dies ist die gesuchte Zahl
    //long zeit;
    //long zeit1000;
    //long zeit30;
    long zeitFinal;
    
    public LineareSuche(){
    }
    
    public void erzeugeZufallszahl(int plätze,int oberGrenze) {
        //Erzeugt nicht gleichverteilte Zufallszahlen (doppelte sind möglich)
        
        liste = new int [plätze];
        //Anzahl an Plätze wird übergeben
        
        for (int i=0; i<liste.length;i++) {
            liste[i] = zufall.nextInt(oberGrenze);
            // Liefert eine int-Pseudo-Zufallszahl im Bereich von 0 bis oberGrenze
        }
    }
    
    public void sortieren(){
        Arrays.sort(liste);
    }
    
    
    
    public void ausgabe() {
        for (int i=0; i<liste.length; i++) {
            System.out.println(liste[i] + " || Index: " + (i));
        }
    }
    
    
    
    
    
    
    
    public int suche() {
        
        int suchzahl = liste[zufall.nextInt(liste.length)]; //legt eine zufällige Suchzahl im Array fest
        for (int i = 0; i < liste.length; i++){
            if(liste[i] == suchzahl){
                return suchzahl; //wenn gefunden wird ausgegeben
            }
        }
                
        return -1; //wenn nicht gefunden
        
        
    }
    
    
    public long suchzeitLinear2() {         //schritte1 = 30 , schritte2= 1000
        
        
        long zeit30=0; //Zeit für 30 Suchen
        
        for (int x=0; x<30;x++) {
        long    zeit1000=0;; // Zeit für 1000 Suchen
        for (int j=0; j<1000;j++ ) {
            
            final long timeStart = System.nanoTime();
            suche();
            final long timeEnd = System.nanoTime();
            long zeit = timeEnd - timeStart; //Dieser Wert soll für Mittelwert benutzt werden
            //System.out.println("Zeit1: "+zeit);
            zeit1000 += zeit;
            //System.out.println("Zeit innen Addiert: "+zeit1000);
            
        }
        zeit30 += zeit1000/1000;
        //System.out.println("Ende innere Schleife / 1000 : "+zeit30);
        }
        
        long zeitFinal=zeit30/30;
        System.out.println(zeitFinal);
        return zeitFinal;
    }
    
    
    

    
    
    public static void main(String[] args) {
        LineareSuche l1= new LineareSuche();
        l1.erzeugeZufallszahl(1000, 2000);
        l1.sortieren();
        //l1.ausgabe();
        l1.suchzeitLinear2();
        //l1.suchzeit30();
    
        
        
    
    }
}



Vielen Dank schon mal und viele Grüße
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Mir ist folgendes aufgefallen:
-je mehr Suchen ich starte, desto geringer wird dann die finale Suchzeit (also das Endergebnis nach den 1000 und 30 mal). Wenn ich jetzt z.B. für die erste innere Schleife eine Zahl von 10.000 und für die äußere 200 statt 1.000 und 30 eingebe, ist die suche laut meinem Code viel schneller als zuvor.
- Der Wert sollte sich doch eigentlich einpendeln und immer ungefähr das selbe anzeigen ?

Kann mir da jemand vielleicht erklären woran dies liegt ? Habe ich einen Fehler gemacht?
Der Java-Code wird erst während der Laufzeit anhand der Benutzung zur Laufzeit optimiert.


Wird eine Methode nur einmal (oder analog weniger Male) aufgerufen, lohnt sich ein optimieren nicht - der Code ist ja schon fertig, bevor er optimiert werden würde - stattdessen wird es sehr langsam interpretiert.
Wenn die Methode dann öfter ausgeführt wird, werden "Hotspots", Stellen die oft ausgeführt werden, optimiert. Und je öfter, desto besser optimiert.
In deinem Code kann das im Extremfall dazu führen, dass die suche gar nicht ausgeführt wird, da sie auf das "Ergebnis" deines Programms keine Auswirkung hat ("Dead Code Elimination").


Deshalb nutzt man wie schon gesagt entsprechende Frameworks, die solche Effekte berücksichtigen. Diese führen zb einen "Warmup" durch, ein mehrmaliges Ausführen des Codes, damit er optimiert ist, bevor die eigentliche Messung beginnt und bieten Möglichkeiten, Dead Code Elimination zu verhindern.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Java Lineare-Suche Zeitmessung Java Basics - Anfänger-Themen 5
V_Fynn03 Beliebiges Element in einer Liste löschen (Java)(Lineare Datenstrukturen) Java Basics - Anfänger-Themen 9
TimoN11 Java Klassen Global einbinden Java Basics - Anfänger-Themen 1
H Binominalkoeffizient tail-rekursiv in java darstellen Java Basics - Anfänger-Themen 0
H Audio in Java Java Basics - Anfänger-Themen 3
I Erklärung zum Java Code Java Basics - Anfänger-Themen 2
AlexVo String zu Java Anweisung getString("*** java code ***") Java Basics - Anfänger-Themen 19
R Java (Eclipse) "Lagerverwaltung" HILFE Java Basics - Anfänger-Themen 13
TimoN11 Java - Eine oder mehrere Eingaben möglich machen Java Basics - Anfänger-Themen 6
M Rekursive Java-Methode Java Basics - Anfänger-Themen 13
M Java Spiel wie Wer wird Millionär Java Basics - Anfänger-Themen 1
bafou Dreieckszahlen in java Java Basics - Anfänger-Themen 3
P Best Practice Druck aus Java Anwendung in MacOs Java Basics - Anfänger-Themen 0
G Java 2-dimensionalen int-Array Summe Java Basics - Anfänger-Themen 2
B java.time Duration mit Kommazahl? Java Basics - Anfänger-Themen 4
Devin Wo kann man einen Java Lehrplan finden? Java Basics - Anfänger-Themen 5
KogoroMori21 Java Datum Differenz (kleiner Fehler) Java Basics - Anfänger-Themen 10
O Java Weinachtsbaum in einem Bilderramen Java Basics - Anfänger-Themen 5
F Java Programm, das kleine Buchstaben in einem String zählen soll und bei großen Buchstaben oder Sonderzeichen abbrechen soll. Java Basics - Anfänger-Themen 5
Gaudimagspam Dringend Java Hilfe benötigt Java Basics - Anfänger-Themen 19
M Java Kompilieren über Package grenzen hinaus Java Basics - Anfänger-Themen 4
N java.util.InputMismatchException Fehler Java Scanner Java Basics - Anfänger-Themen 1
Gaudimagspam BMI in Java implementieren Java Basics - Anfänger-Themen 38
C Was ist nötig für ein Java-Programm auf Server für Website Java Basics - Anfänger-Themen 18
F Fehlermeldung java.lang.NullPointerException Java Basics - Anfänger-Themen 4
S Sprung mit Java (GameGrid) Java Basics - Anfänger-Themen 9
Devin Wie lange braucht man um Java zu beherrschen und wie kann man es am schnellsten erlernen? Java Basics - Anfänger-Themen 7
G Java Klassen und Instanzmethoden Java Basics - Anfänger-Themen 15
Zrebna Frage zum "Referenzen-konzept" in Java Java Basics - Anfänger-Themen 8
C java.util Timer läuft zu langsam? Java Basics - Anfänger-Themen 1
T Klassendiagramm in Java überführen Java Basics - Anfänger-Themen 2
Gaudimagspam Caesars Code entziffern in Java Java Basics - Anfänger-Themen 8
V Gehalt berechnen in Java Java Basics - Anfänger-Themen 6
java3690 Java- liste füllen ud die werte addieren Java Basics - Anfänger-Themen 13
justemii Gehalt berechnen - Aufgabe Java-Programm Java Basics - Anfänger-Themen 9
P Mit iPad Java lernen Java Basics - Anfänger-Themen 15
W Java in Exe Datei umgewandelt, Ressourcen fehlen (Bilder und Audiodateien) Java Basics - Anfänger-Themen 1
N Best Practice How can I creat a programm with java under windows 10 in order to open an spreadsheet in libreoffice calc format Java Basics - Anfänger-Themen 11
T Start-Activity für Java Maven Web-Anwendung festlegen Java Basics - Anfänger-Themen 2
J Java FX - Label aktualisieren Java Basics - Anfänger-Themen 1
A Hilfe bei Java Projekt Java Basics - Anfänger-Themen 4
G Java Bruchrechner Addition, Multiplikation... Java Basics - Anfänger-Themen 12
M Java Einstellung von Apache POI für MS Word Erstellung mit Eclipse Java Basics - Anfänger-Themen 6
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
T Java Swing - Dreieck zeichnen mit verschiedenen Variablen Java Basics - Anfänger-Themen 8
P Wie für EIN Java Programm von 64bit Java (=Standard) auf 32bit Java Installation (Windows) umschalten? Java Basics - Anfänger-Themen 6
C Suche Nachhilfe in Java Java Basics - Anfänger-Themen 5
B java.io.OutputStream zu java.io.InputStream konvertieren Java Basics - Anfänger-Themen 18
A Scanner Befehl Java Anfänger Java Basics - Anfänger-Themen 8
M Java entity und wertklassen Java Basics - Anfänger-Themen 2
G Java Vererbung Java Basics - Anfänger-Themen 8
M Java Klasse Object Java Basics - Anfänger-Themen 5
M Java GUI label ändert sich erst zum Schluss Java Basics - Anfänger-Themen 4
G Java Lambda Ausdrücke Java Basics - Anfänger-Themen 19
M Java GUI explorer aufrufen um Pfad zu bekommen Java Basics - Anfänger-Themen 3
M Java Anweisungen Java Basics - Anfänger-Themen 4
M Java 8 Lambda Expression Java Basics - Anfänger-Themen 1
S Java Array Probleme Java Basics - Anfänger-Themen 3
Mr_Kleeblatt Operatoren if (arri[i] != "test.java"&& arri[i] != "test.class") Java Basics - Anfänger-Themen 3
S Java Stream API Java Basics - Anfänger-Themen 6
S Java Array Problem... Java Basics - Anfänger-Themen 2
M Java Listen Java Basics - Anfänger-Themen 4
G Java Object value und entity? Java Basics - Anfänger-Themen 2
X Kurzes Java-Programm, das sich komisch verhält Java Basics - Anfänger-Themen 6
_Zabuza_ Erste Schritte Wie am effektivsten Java lernen als Anfänger? Java Basics - Anfänger-Themen 12
G Java Dateisystem Java Basics - Anfänger-Themen 4
G Java charAt Methode Java Basics - Anfänger-Themen 10
L Java lernen Java Basics - Anfänger-Themen 1
G Rot-Schwarz-Bäume Java Java Basics - Anfänger-Themen 10
G Java LinkedList remove Methode Java Basics - Anfänger-Themen 5
G Java LinkedList Java Basics - Anfänger-Themen 6
G Java eingelesene Zahlen Java Basics - Anfänger-Themen 2
Y Java andere Klasse aufrufen Java Basics - Anfänger-Themen 6
I Java zweidimensionales array befüllen mit for-schleife Java Basics - Anfänger-Themen 2
Z vereinfachtes Wörterbuch in java modellieren Java Basics - Anfänger-Themen 10
L Zufälliges Objekt aus der ArraylList ohne java.util.Random Java Basics - Anfänger-Themen 56
S Geht das bei Java ? Java Basics - Anfänger-Themen 11
T Java Anfänger mit konkreten Fragen Java Basics - Anfänger-Themen 2
C Java Spiel Java Basics - Anfänger-Themen 3
R Java SQL Fehler! Java Basics - Anfänger-Themen 4
CT9288 Fragen zu Java Java Basics - Anfänger-Themen 16
M Java Version Verständnisfrage Java Basics - Anfänger-Themen 16
G Java equals() Methode Java Basics - Anfänger-Themen 9
G Java Objekte auf Duplikate testen Java Basics - Anfänger-Themen 4
D Java Einstieg Java Basics - Anfänger-Themen 4
K Java Projekt Hilfe Java Basics - Anfänger-Themen 5
B Java Mail -> Mail senden, ist aber nich in IMAP unter "Gesendet" Java Basics - Anfänger-Themen 3
jmar83 Bluetooth-Zugriff, braucht es dazu plattformabhängige Libraries oder kann das Java mittlerweile selbst? Java Basics - Anfänger-Themen 10
E Macht Java Rechenfehler beim Potenzieren und Mod? Java Basics - Anfänger-Themen 5
F Java GUI-PaintComponent funktioniert nicht Java Basics - Anfänger-Themen 1
Z Methode zum Heraufinden von Anagrammen ohne Java API, Ausnahme String Java Basics - Anfänger-Themen 14
K Java Aufgaben-Wie ran gehen? Java Basics - Anfänger-Themen 6
S Kreisberechnung3 Buch: Programmieren lernen mit Java von Hans-Peter Habelitz Java Basics - Anfänger-Themen 39
V Ersätze für Java-Scanner Java Basics - Anfänger-Themen 9
M Quiz in Java programmieren mit Array Java Basics - Anfänger-Themen 8
D java.lang.NullPointerException Java Basics - Anfänger-Themen 19
J Welche Java-Version installieren Java Basics - Anfänger-Themen 9
A Java.util.Arrays Java Basics - Anfänger-Themen 15
X Reverse algorithm engineering (Java code) Java Basics - Anfänger-Themen 6
C Wie habt Ihr angefangen mit der Java Programmierung, ohne Programmiervorkenntnisse Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Anzeige

Neue Themen


Oben