2016-04-09 8 views
0

Wir arbeiten an einer Signalverarbeitungsanwendung, es gibt eine bestimmte Art von Hardware im PC und einen C-Treiber, der damit kommuniziert. Die Anwendung Frontend/GUI wird in JavaFX geschrieben. Wir haben einige Probleme mit dem JavaFX LineChart, wir messen die elektrische Signalfrequenz und versuchen, sie auf dem oben erwähnten LineChart zu plotten.LineChart-Leistungsabfall im Laufe der Zeit

Die Messungen laufen in einer Schleife, bis 1000 Samples gesammelt wurden, wir haben mit 100Hz-Signal getestet, was bedeutet, dass es 10s dauert, um diese 1000 Samples zu erhalten.

Es wird ein separater 'LineChart'-Thread ausgeführt und geprüft (alle 10ms), ob neue Muster verfügbar sind. Wenn diese dem LineChart hinzugefügt werden, setzt der LineChart-Thread das LineChart zurück (löscht die Serie) Daten) und der Prozess beginnt von vorne.

Alles läuft gut für die ersten ~ 20 min, nach denen es scheint, dass das LineChart "verlangsamt", es sieht so aus, als ob die Zeichnung nicht so schnell/dynamisch wie am Anfang ist.

Wir haben so gut wie alles in der Anwendung überprüft und nichts gefunden, daher haben wir ein separates Projekt erstellt, das nur das LineChart und einen Thread enthält, der dem Diagramm alle 10ms Stichproben hinzufügt (bis zu 1000 Stichproben) . Wir haben das gleiche Verhalten beobachtet, hier ist, wie es gemacht wird:

 Thread t = new Thread(new Runnable() { 
     @Override 
     public void run() { 

      int iteration = 0; 
      long start = 0; 
      long stop = 0; 

      while (run) { 

       CountDownLatch latch = new CountDownLatch(1); 
       start = System.currentTimeMillis(); 

       for (int i = 0; i < 1001; i++) { 
        double ran = random(50, 105); 
        final int c = i; 

        Platform.runLater(() -> { 
         series.getData().add(new XYChart.Data<>(c, ran)); 

         if (c == 1000) { 
          System.out.print("Points: " + series.getData().size()); 
          series.getData().clear(); 

          latch.countDown(); 
         } 
        }); 

        try { 
         Thread.sleep(10); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
       iteration++; 
       stop = System.currentTimeMillis(); 

       try { 
        latch.await(); 
       } catch (InterruptedException e) {} 

       System.out.println(", Iteration : " + iteration + ", elapsed: " + (stop - start) + " [ms]"); 
      } 
     } 
    }); 

Was fehlt uns hier? Warum fällt die Leistung im obigen Beispiel nach ~ 30-45 min ab? Irgendwelche Ideen?

Das obige Stück Code wurde für 8h ausgeführt, jedes Mal, wenn alle Punkte zum Diagramm hinzugefügt wurden, war die "Zeichnungszeit" vergleichbar (zwischen 10100ms und 10350ms).

+0

Sie sagen _Wir haben das gleiche Verhalten beobachtet _ und jedes Mal, wenn alle Punkte zum Diagramm hinzugefügt wurden, war die 'Zeichnungszeit' vergleichbar_. Sollte es keine Verlangsamung geben, so sind die Zeiten nicht alle gleich? Auch nur eine Idee, in einem Aktienmarktdiagramm kann ich Daten entfernen und es wird nie langsamer. Vielleicht 'if (c> 1000) series.getData(). Remove (0,500)'; – brian

+0

Das dachte ich, und deshalb habe ich angefangen, diese Zeit zu messen, was zu meiner Überraschung in jeder Iteration auf vergleichbarem Niveau war. Laufen Sie Ihr Diagramm in einer Schleife? Darf ich fragen mit welchen Parametern? Wie viele Punkte, wie hoch ist die Aktualisierungsrate, für wie lange haben Sie sie ausgeführt? – Stugal

+0

Ich bekomme Daten von einem Sockel, 3hz max, ein paar 1000 Punkte, bis ich alte entferne. Ich benutze es nicht mehr, weil ich mehr Punkte möchte, aber es würde für 8 Stunden arbeiten. Ich verstehe immer noch nicht, ob das Codebeispiel für Sie langsamer wird. Wenn die Zeiten gleich sind, wird es nicht langsamer. – brian

Antwort

0

Sie haben nichts falsch mit dem Code, den ich sehen kann, aber Sie fügen die Serie hinzu. Ich glaube nicht, dass dies ein Problem mit dem Code ist, aber es ist die Maschine, die versucht, alle Punkte, die Sie haben, zu halten und zu verwalten. Sie sagten 1000 in 10s, das bedeutet, dass Sie nach 20 Minuten 120.000 Punkte im Speicher haben. verwaltet und geplottet werden. Unter der Annahme, dass Sie auf den Zehntelplatz aufnehmen, das ist eine TON Speicher, und mehr wahrscheinlich als Sie nicht, Sie sehen die Verarbeitung verlangsamt mit all diesen Informationen. Einfach gesagt, die Maschine kann damit nicht umgehen.

+0

Danke für die Eingabe, das ist es leider nicht. Jedes Mal, wenn 1000. Probe zum Diagramm hinzugefügt wird, wird die Diagrammreihe gelöscht, wie Sie im if Block sehen. – Stugal

+0

in diesem Fall bin ich mir nicht sicher, vielleicht ist es der Speicher für die 120.000 Punkte, 100 Punkte auf einmal zugeordnet. Manchmal wird Java ein wenig klebrig. Ich weiß nicht, was es verursacht oder warum es das tut, aber es passiert gelegentlich. – Rocket6488

+0

Wir überwachen den Speicherverbrauch, alles sieht gut aus, also auch CPU – Stugal