Klassen Richtige Anwendung einer Enum-Klasse

PaulGustav

Mitglied
Hallo zusammen,

bisher habe ich hier echt tolle Ratschläge bekommen. Heute habe ich nur ein Anliegen bezüglich der Verbesserung meiner Rechenzeit.
Ich habe eine große Menge an Daten, welche in 30 sek Intervallen mit Zeitstempeln versehen sind:
Timestamp , Attribut1, Attribut2, SegmentIDs
2015-12-06T06:17:00Z, 5, 10 , 1001|1002|1003|
, 15, 25 , 2004|2005|2006|
2015-12-06T06:17:30Z, 10, 15 , 1001|1002|1003|1004|
, 20, 30 , 2004|2005|​
Während ich meine Daten auslese, speichere ich die SegmentIDs je nach ihrem Zeitstempel mit ihren Attributen in einer Map. Da ich an das Auftreten der SegmentIDs an verschiedenen Tagen und Tageszeiten interessiert bin, nutze ich eine Enum-Klasse, um festzustellen, ob die SegmentID entweder am Wochenende, wochentags, morgens oder abends gemeldet wurde. Es ergeben sich demnach 4 (hash)Maps: MP-WD, EP-WD, MP-WE, EP-WE
Wobei MP=MorningPeak, EP=EveningPeak, WD=Weekday, WE=Weekend.
Nun habe ich also die Enum-Klasse EnumDayProperties:
Java:
public class EnumDayProperties {
  
    public static String getWeekday (Instant day){
        String dayProperty = null;
        LocalDateTime ldt = LocalDateTime.ofInstant(day, ZoneId.of("Zulu"));
        LocalDate ld = LocalDate.parse(ldt.toLocalDate().toString());
        int ordinalNumberDay = getOrdinalFromWeekday(ld.getDayOfWeek().toString());
        if(ordinalNumberDay == 5 || ordinalNumberDay == 6)
            dayProperty = "WE";
        else
        dayProperty = "WD";
        return dayProperty;
    }
    public enum Weekday{
        MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
    }  
    public enum Peak{
        MP, EP, NP
    }
    public static String getOrdinalFromTime (LocalTime time){
        String peak = null;
        if(time.isAfter(LocalTime.parse("06:00:00")) && time.isBefore(LocalTime.parse("12:00:00")))
            peak = "MP";
        else if(time.isAfter(LocalTime.parse("12:00:00")) && time.isBefore(LocalTime.parse("18:00:00")))
            peak = "EP";
        peak = "NP";  
        return peak;
    }
    public static boolean TimeSliceIsMorning (String string){
        LocalTime morningEnd = LocalTime.parse("12:00:00");
        LocalTime morningStart = LocalTime.parse("06:00:00");
        LocalTime time = LocalTime.parse(string);
        return time.isBefore(morningEnd) && time.isAfter(morningStart);
    }
    private static int getOrdinalFromWeekday( String name )
    {
      try {
        return Weekday.valueOf( name ).ordinal();
      }
      catch ( IllegalArgumentException e ) {
        return 9999;
      }
    }
}

Auf der anderen Seite habe ich nun meine Ranking der SegmentIDs:
Java:
public class DsegRanking {
   public static void main(String[] args) throws Exception{
       Map<Long, DsegProperties> mpWD = new HashMap<>();
       Map<Long, EveningDsegProperties> epWD = new HashMap<>();
       Map<Long, DsegProperties> mpWE = new HashMap<>();
       Map<Long, EveningDsegProperties> epWE = new HashMap<>();
       List<File> fileList = new ArrayList<File>();
       //getting the list of all files that need to be parsed
       fileList = getAllFiles();
       String line = "";
       BufferedReader dataLine = null;
       Instant timestamp = null;
       for (int j = 0; j < fileList.size(); j++) {
           try {
               FileInputStream fin = new FileInputStream(fileList.get(j));
               GzipCompressorInputStream gzIn = new GzipCompressorInputStream(fin);
               Reader rd = new InputStreamReader(gzIn, "US-ASCII");
               dataLine = new BufferedReader(rd);
               while ((line = dataLine.readLine()) != null) {
                   String[] content = line.split(",");
                   if (StringUtils.isEmpty(content[COLUMN_TIMESTAMP]) == false ) {
                       timestamp =(content[COLUMN_TIMESTAMP]);
                       chooseMap(mpWD,epWD,mpWE,epWE,content,timestamp);
                   }
                   else if (content[COLUMN_TIMESTAMP].isEmpty()) {
                       chooseMap(mpWD,epWD,mpWE,epWE,content,timestamp);
                   }
               }
           }
            catch (IOException ex) {
               ex.printStackTrace();
           }
       }
       writeJamsMorningWeekdays(mpWD);
       writeJamsEveningWeekdays(epWD);
       writeJamsMorningWeekend(mpWE);
       writeJamsEveningWeekend(epWE);
   }
  
   private static void chooseMap(Map<Long, DsegProperties> mpWD, Map<Long, EveningDsegProperties> epWD,
           Map<Long, DsegProperties> mpWE, Map<Long, EveningDsegProperties> epWE, String[] content, Instant timestamp) {
       String day = Implements.EnumDayProperties.getWeekday(timestamp);
       String time = Implements.EnumDayProperties.getPeak(timestamp);
       if (day.contains("WD") && time.contains("MP"))
           calculateDsegProperties(content,mpWD,timestamp);
       else if (day.contains("WD") && time.contains("EP"))
           calculateEveningDsegProperties(content,epWD,timestamp);
       else if (day.contains("WE") && time.contains("MP"))
           calculateDsegProperties(content,mpWE,timestamp);
       else if (day.contains("WE") && time.contains("EP"))
           calculateEveningDsegProperties(content,epWE,timestamp);
   }
  
   private static void calculateDsegProperties(String[] content, Map<Long, DsegProperties> mapping, Instant timestamp) {
       List<Long> dsegColumnList = new ArrayList<>(600000);
       String dsegColumn = content[COLUMN_DSEGID];
       getDsegs(dsegColumn, dsegColumnList);
       for (Long segmentID : dsegColumnList){
           DsegProperties dsegProperties = mapping.get(segmentID);
           if (dsegProperties == null){
               dsegProperties = new DsegProperties(content,segmentID,timestamp);
               mapping.put(segmentID, dsegProperties);
           }
           else if(dsegProperties != null){
               dsegProperties.updateDsegID(content, segmentID,timestamp);
               mapping.put(segmentID, dsegProperties);
           }
       }
      
   }
   private static void calculateEveningDsegProperties(String[] content, Map<Long, EveningDsegProperties> mapping, Instant timestamp) {
       List<Long> dsegColumnList = new ArrayList<>(600000);
       String dsegColumn = content[COLUMN_DSEGID];
       getDsegs(dsegColumn, dsegColumnList);
       for (Long segmentID : dsegColumnList){
           EveningDsegProperties dsegProperties = mapping.get(segmentID);
           if (dsegProperties == null){
               dsegProperties = new EveningDsegProperties(content,segmentID,timestamp);
               mapping.put(segmentID, dsegProperties);
           }
           else if(dsegProperties != null){
               dsegProperties.updateEveningDsegID(content, segmentID,timestamp);
               mapping.put(segmentID, dsegProperties);
           }
       }
      
   }
}

Die Klasse DsegProperties hält lediglich die Attribute fest und inkrementiert diese via updateDsegProperties. Dafür nutze ich leider zweimal dieselbe Klasse. Einmal für den vormittags und einmal für abends. Für die Berechnung des gesamten Datensatzes über ein Jahr (ca 60 Mio Datensätze) habe ich nun 11 Std. benötigt. Kann ich die Enum-Klasse irgendwie effizienter verwenden, sodass die Rechenleistung gesteigert wird?

Ich hoffe, dass das soweit verständlich dargeboten ist. Vielen Dank schon mal

Paul
 

mrBrown

Super-Moderator
Mitarbeiter
Kann ich die Enum-Klasse irgendwie effizienter verwenden, sodass die Rechenleistung gesteigert wird?
Naja, du könntest zumindest den enum überhaupt mal verwendet, aktuell ignorierst du die, wenn ich's richtig sehe, und benutzt nur dir statischen Klassen. Deine Code-Stil ist etwas ... gewöhnungsbedürftig, das macht das nicht so leicht...

Deine Weekday-Klasse ist völlig überflüssig, die kannst du ersetzten, mit einem enum mit WeekDay und WeekEnd, die du dann überall statt "WE" und "WD" benutzt.

Das gleiche solltest du mit Peak machen, und denn enum statt den Strings verwenden.

Deine Methoden sind oftmals etwas kompliziert gelöst
Java:
public static String getWeekday (Instant day){
        String dayProperty = null;
        LocalDateTime ldt = LocalDateTime.ofInstant(day, ZoneId.of("Zulu"));
        LocalDate ld = LocalDate.parse(ldt.toLocalDate().toString());
        int ordinalNumberDay = getOrdinalFromWeekday(ld.getDayOfWeek().toString());
        if(ordinalNumberDay == 5 || ordinalNumberDay == 6)
            dayProperty = "WE";
        else
        dayProperty = "WD";
        return dayProperty;
    }

Du bekommst einen Instant, erstellst daraus dein LocalDateTime-Objekt, formatierst das als String, parst daraus ein LocalDate, nimmst davon den Wochentag, formatierst den als String, parst daraus den Wochentag, und lässt dir davon den Index geben.

Das ganze ständige Umwandeln ist völlig überflüssig und kostet riesig Performance, stattdessen geht auch einfach:
Java:
public static String getWeekday (Instant day){
        String dayProperty = WD;
        LocalDateTime ldt = LocalDateTime.ofInstant(day, ZoneId.of("Zulu"));
        if (ldt.getDayOfWeek().getValue() >= 6) {
            dayProperty = WE;
       }
     return dayProperty;
    }

In den anderen Methoden das gleiche, das Parsen wiederholst du bei jedem Methodenaufruf, und mehrmals für die gleichen werte, die solltest du lieber als Konstanten anlagen und nur einmal Parsen,
 

PaulGustav

Mitglied
Ja hi MrBrown,

vielen Dank für dein Feedback. So langsam wird mir mein umständlicher Code auch klar...

Deine Code-Stil ist etwas ... gewöhnungsbedürftig
Ich lerne seit August 2016 Java und entschuldige mich schon einmal für überflüssige Methodenaufrufe in meinen Codes.

Deine Weekday-Klasse ist völlig überflüssig, die kannst du ersetzten, mit einem enum mit WeekDay und WeekEnd, die du dann überall statt "WE" und "WD" benutzt.
Meinst du mit ersetzen, dass ich die zwei Enum-Größen vorab einfach definiere?
Code:
private static final Enum weekDay;
private static final Enum weekEnd;
Oder sollte ich etwa nur den Modifizierer ändern?
Code:
public enum Day{
       WeekDay, WeekEnd;
   }

Zudem verstehe ich leider deinen angebrachten Code nicht. WD und WE müssten ja Strings darstellen, welche von Anführungszeichen umgeben sind, oder? Damit wäre mein bisheriges Problem ja nicht gelöst.

Ich habe die Enum-Klasse lediglich über Java ist auch eine Insel kennengelernt.
 

mrBrown

Super-Moderator
Mitarbeiter
Ich lerne seit August 2016 Java und entschuldige mich schon einmal für überflüssige Methodenaufrufe in meinen Codes.

gewöhnungsbedürftig ist vor allem auch deine Schreibweise bei ifs.
Mal ohne, mal mit Klammer, mal else, mal else if mit nur negierter Bedingung...das einheitlich zu haben macht es deutlich einfacher ;)


Oder sollte ich etwa nur den Modifizierer ändern?
Ja, genau so.

Zudem verstehe ich leider deinen angebrachten Code nicht. WD und WE müssten ja Strings darstellen, welche von Anführungszeichen umgeben sind, oder? Damit wäre mein bisheriges Problem ja nicht gelöst.
Nein, die sollen ja eben keine Strings sein, sondern enums ;) In meinem Code oben muss es nicht String sondern Day sein, lässt sich nur jetzt nicht mehr bearbeiten, so muss es sein:

Java:
public static Day getWeekday (Instant day){
        Day dayProperty = WD;
        LocalDateTime ldt = LocalDateTime.ofInstant(day, ZoneId.of("Zulu"));
        if (ldt.getDayOfWeek().getValue() >= 6) {
            dayProperty = WE;
       }
     return dayProperty;
    }
 

PaulGustav

Mitglied
Okay ich habe nun die Methoden getPeak und getWeekday wie folgt angepasst:
Java:
public static Day getWeekday (Instant day){
       Day dayProperty = Day.WeekDay;
       LocalDateTime ldt = LocalDateTime.ofInstant(day, ZoneId.of("Zulu"));
       if(ldt.getDayOfWeek().getValue()>=6){
           dayProperty = Day.WeekEnd;
       }
       return dayProperty;
   }
 
   public static Peak getPeak (Instant time){
       Peak peakProperty = Peak.EP;
       LocalDateTime ldt = LocalDateTime.ofInstant(time, ZoneId.of("Zulu"));
       LocalTime morningBeginn = LocalTime.parse("06:00:00");
       LocalTime morningEnd = LocalTime.parse("12:00:00");
       if (ldt.toLocalTime().isAfter(morningBeginn)&&ldt.toLocalTime().isBefore(morningEnd)){
           peakProperty = Peak.MP;
       }
       return peakProperty;
   }
 
   public enum Day{
       WeekDay, WeekEnd;
   }
 
   public enum Peak{
       MP, EP
   }

Nun muss ich nur noch die Klasse DsegRanking darauf abstimmen. Bisher habe ich die Ergebnisse aus der EnumDayProperties wie folgt angewandt:
Java:
private static void chooseMap(Map<Long, DsegProperties> mpWD, Map<Long, EveningDsegProperties> epWD,
           Map<Long, DsegProperties> mpWE, Map<Long, EveningDsegProperties> epWE, String[] content, Instant timestamp) {
       String day = Implements.EnumDayProperties.getWeekday(timestamp);
       String time = Implements.EnumDayProperties.getPeak(timestamp);
       if (day.contains("WD") && time.contains("MP"))
           calculateDsegProperties(content,mpWD,timestamp);
       else if (day.contains("WD") && time.contains("EP"))
           calculateEveningDsegProperties(content,epWD,timestamp);
       else if (day.contains("WE") && time.contains("MP"))
           calculateDsegProperties(content,mpWE,timestamp);
       else if (day.contains("WE") && time.contains("EP"))
           calculateEveningDsegProperties(content,epWE,timestamp);
   }

Da ich ja vermeiden will bzw sollte, dass ich die Enums mit einem String vergleich, habe ich mir gedacht, dass man ja die ordinalen Zahlen nehmen kann, die bei den Enums hinterlegt sind:
Java:
private static void chooseMap(Map<Long, DsegProperties> mpWD, Map<Long, EveningDsegProperties> epWD,
           Map<Long, DsegProperties> mpWE, Map<Long, EveningDsegProperties> epWE, String[] content, Instant timestamp, List<Instant> timeStampList) {
       Enum day = Implements.EnumDayProperties.getWeekday(timestamp);
       Enum time = Implements.EnumDayProperties.getPeak(timestamp);
       System.out.println("Enum day (ord) = " + day.ordinal());
       System.out.println("Enum time (ord) = " + time.ordinal());
       if (day.ordinal()==0 && time.ordinal()==0){
           System.out.println("timestamp is WD-MP");
           calculateDsegProperties(content,mpWD,timestamp,timeStampList);
       }
//same code äquivalent for epWD, mpWE, epWE
// and without the print-functions
   }
Das scheint so erstmal zu klappen. Danke vielmals.

Oder meinst du, ich könnte die ChooseMap noch besser gestalten?

Oder kann ich die Schritte für
 

Joose

Top Contributor
Nun muss ich nur noch die Klasse DsegRanking darauf abstimmen. Bisher habe ich die Ergebnisse aus der EnumDayProperties wie folgt angewandt:

Da ich ja vermeiden will bzw sollte, dass ich die Enums mit einem String vergleich, habe ich mir gedacht, dass man ja die ordinalen Zahlen nehmen kann, die bei den Enums hinterlegt sind:
Anstatt mit dem Ordinal zu vergleichen vergleiche direkt mit dem EnumWert ;)

Java:
....
   if (day == Day.WeekDay && time == Peak.MP) {
       calculateDsegProperties(content,mpWD,timestamp);
   } else if (day == Day.WeekDay && time == Peak.EP) {
       calculateEveningDsegProperties(content,epWD,timestamp);
   } else if (day == Day.WeekEnd && time == Peak.MP) {
       calculateDsegProperties(content,mpWE,timestamp);
   } else if (day == Day.WeekEnd && time == Peak.EP) {
       calculateEveningDsegProperties(content,epWE,timestamp);
   }...

Ach ja ich würde dir raten, auch wenn der Compiler es erlaubt sei wegzulassen, immer Klammern zu setzen ;)
 

PaulGustav

Mitglied
Wow sauber!
Allein für 10 h eines Tages (ca. 50 - 70k Datensätze) brauche ich nun nur noch 28 statt 50 sek Zeit.
Sobald ich das ganze Jahr nochmal durchlaufen lasse, poste ich dann auch mal diesen Fortschritt.

Vielen Dank.

P.S.: Die Bedingungen versuche ich fortan immer konsistent zu halten.
 

Joose

Top Contributor
Allein für 10 h eines Tages (ca. 50 - 70k Datensätze) brauche ich nun nur noch 28 statt 50 sek Zeit.
Sobald ich das ganze Jahr nochmal durchlaufen lasse, poste ich dann auch mal diesen Fortschritt.

Ein paar kleine Vorschläge hätte ich noch. Bin mir zwar nicht sicher ob diese einen wirklichen Unterschied ausmachen werden, aber probieren kannst du es ja.

In der Klasse mit deiner getPeak Methode könntest du das Parsen von den 2 Uhrzeiten aus der Methode auslagern.
Vorteil: Du musst beide Zeiten nur 1x parsen und kannst sie immer verwenden.
Auch den Aufruf toLocalTime() würde ich vor das if-ziehen.
Vorteil: Auch hier sparst du dir doppeltes umwandeln
Java:
private static LocalTime begin = LocalTime.parse("06:00:00");

private static LocalTime end = LocalTime.parse("12:00:00");

public static Peak getPeak (Instant time) {
   Peak peakProperty = Peak.EP;
   LocalDateTime dateTime = LocalDateTime.ofInstant(time, ZoneId.of("Zulu"));
   LocalTime time = dateTime.toLocalTime();
   if (time.isAfter(begin) && time.isBefore(end)) {
       peakProperty = Peak.MP;
   }
   return peakProperty;
}

In der Methode getWeekday(Instant)[icode] und [icode]getPeak(Instant) wandelst du jeweils das Instant Objekt zu einem LocalDateTime um.
Sprich auch hier machst du dieselbe Umwandlung doppelt.
Mögliche Verbesserung:
Java:
LocalDateTime dateTime = LocalDateTime.ofInstant(time, ZoneId.of("Zulu"));
String day = Implements.EnumDayProperties.getWeekday(dateTime);
String time = Implements.EnumDayProperties.getPeak(dateTime);
Natürlich musst du die Methoden getWeekday(Instant)[icode] und [icode]getPeak(Instant) entsprechend anpassen.


Eine Codevereinfachung ist vielleicht auch bei den Methoden calculateDsegProperties und calculateEveningDsegProperties möglich.
Der einzige Unterschied besteht hierbei, dass entweder ein DsegProperties oder EveningDsegProperties Objekt erstellt wird (und der entsprechenden "update" Methode). Worin unterscheiden sich diese Klassen?
Vielleicht wäre eine passende gemeinsame Basisklasse hilfreich.

Java:
private static void calculateProperties(String[] content, Map<Long, DsegProperties> mapping, Instant timestamp, boolean evening) {
   List<Long> dsegColumnList = getDsegs(content[COLUMN_DSEGID]); // die Methode "getDsegs" liefert nun eine Liste zurück -> was man sich auch erwarten darf wenn die Methode mit "get.." beginnt ;) ansonsten solltest du sie in "fillDsegList" umbenennen
   for (Long segmentID : dsegColumnList) {
       BaseDsegProperties baseDseg = mapping.get(segmentID);
       if (baseDseg == null) {
           if(evening) {
               baseDseg = new EveningDsegProperties(content, segmentID, timestamp);
           } else {
               baseDseg = new DsegProperties(content, segmentID, timestamp);
           }
           mapping.put(segmentID, baseDseg);
       } else if(baseDseg != null) {
           baseDseg.updateID(content, segmentID, timestamp);
           //mapping.put(segmentID, baseDseg); Diese "put" ist unnötig! Das Element ist ja schon in der Liste drinnen ;)
       }
   }
}
 

PaulGustav

Mitglied
Okay. Ich verstehe deine Empfehlung soweit ganz gut. Das herausziehen der LocalTime-Variablen macht das zudem noch übersichtlicher. Ist erledigt.

LocalDateTime dateTime = LocalDateTime.ofInstant(time, ZoneId.of("Zulu"));
String day = Implements.EnumDayProperties.getWeekday(dateTime);
String time = Implements.EnumDayProperties.getPeak(dateTime);

Meinst du, dass es sich mit einem String nun doch schneller rechnen lässt. Mit den Enum-Objekten läuft es doch eigtl ganz gut:
Java:
...
Enum day = Implements.EnumDayProperties.getWeekday(timestamp);
       Enum time = Implements.EnumDayProperties.getPeak(timestamp);
       if (day == Day.WeekDay && time == Peak.MP){
           calculateDsegProperties(content,mpWD,timestamp,timeStampList);
       }
...

Vielleicht wäre eine passende gemeinsame Basisklasse hilfreich.

Ja an solch eine Vereinfachung hatte ich schon gedacht. Die beiden Klassen DsegProperties und EveningDsegProperties verfügen grundlegend über den selben Inhalt. Die Trennung soll lediglich vermeiden, dass die Attribute getrennt (je nach Zeitscheibe) berechnet werden. Ich hatte die Klassen damals sporadisch trennen müssen, als ich die Trennung zwischen Morgen- und Abendstunden eingeführt hatte. Weiter hatte ich mich darum noch nicht gekümmert. Eine Verwirrung "des Lesers" ist hier echt verständlich.

In deime Vorschlag führst du ja die neue Klasse BaseDsegProperties und die Variable evening ein. Es fässt die calculateDsegProperties und calculateEveningDsegProperties zusammen.

Die Methode getDsegs sieht wie folgt aus:
Java:
private static void getDsegs (String dsegColumn, List<Long> dsegColumnList){
       Long id;
       int dsegCount;
       dsegCount=0;
       for (int i=0;i<dsegColumn.length();i++)
       {
           if(dsegColumn.charAt(i) == '|')
           dsegCount++;
       };
       String[] split = dsegColumn.split("\\|");
       for (int i=0;i<dsegCount;i++)
       {
           id = Long.parseLong(split[i]);
           dsegColumnList.add(id);
       }
   }
 

mrBrown

Super-Moderator
Mitarbeiter
Meinst du, dass es sich mit einem String nun doch schneller rechnen lässt. Mit den Enum-Objekten läuft es doch eigtl ganz gut:
Tippfehler, das sollten enums bleiben ;)

Die Methode getDsegs sieht wie folgt aus:
Methoden die mit 'get' beginnen, sollten irgendwas zurückgeben ;)

Sicher, dass die so richtig ist, und aus dsegColumn der letzte Wert egal ist?
aktuell werden aus zb "1111|222|33" nur 1111 und 222 der Liste hinzugefügt, 33 wird ignoriert.
Edit: Grad gesehen, dass die immer mit '|' enden, dann ists natürlich passend so.

Die erste for-Schleife sieht auch überflüssig aus, die Anzahl Elemente bekommst du einfach mit split.length
 

Joose

Top Contributor
Meinst du, dass es sich mit einem String nun doch schneller rechnen lässt. Mit den Enum-Objekten läuft es doch eigtl ganz gut:
Copy&Paste Fehler, wie @mrBrown schon sagt -> bleib bei den Enums

Die Methode getDsegs sieht wie folgt aus:
Ja das kann man auch etwas optimieren.
Java:
private static void getDsegs (String dsegColumn) {
   List<Long> dsegColumnList = new ArrayList<>();
   String[] split = dsegColumn.split("\\|");
   for (int i = 0; i < split.length; i++) {
       long id = Long.parseLong(split[i]);
       dsegColumnList.add(id);
   }
   return dsegColumnList;
}
 

PaulGustav

Mitglied
Habe die Methode getDsegs() schon umgesetzt. Ich habe nun schon einige Durchläufe machen können und folgende Verbesserungen hinsichtlich der Rechenzeiten erreichen können:
Komplettes Jahr 2015:
vorher: time used for 952,399 rows of timestamps: 11:50:08.742
nachher: time used for 952,399 rows of timestamps: 07:03:52.691
Quartal 1 - 2015:
nachher: time used for 245,716 rows of timestamps: 00:56:03.683
Quartal 3 - 2015
vorher: time used for 230,283 rows of timestamps: 04:18:58.123
Quartal 4 - 2015
vorher: time used for 233,266 rows of timestamps: 03:35:41.010

In diesem Sinne: Vielen Dank Leute!

Sobald ich Zeit dafür finde, optimiere ich dann auch mal die calculateDsegProperties bzw calculateEveningDsegProperties und fasse diese zu einer Methode calculateProperties zusammen. Dann sollte der Spaß noch schneller von statten gehen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Dit_ invokeLater | richtige Anwendung Java Basics - Anfänger-Themen 2
G Polymorphismus und die richtige Anwendung Java Basics - Anfänger-Themen 6
krgewb Keine richtige Doku Java Basics - Anfänger-Themen 5
KogoroMori21 Wann ist der richtige Zeitpunkt, um sich Hilfe zu suchen? (Bin Informatik-Student) Java Basics - Anfänger-Themen 10
J Layout Manager, welcher ist der Richtige für mein Program? Java Basics - Anfänger-Themen 1
M Kennt jemand die richtige Lösung? Java Basics - Anfänger-Themen 7
R Ist Java das Richtige für mich? Java Basics - Anfänger-Themen 4
A Java die richtige Programmiersprache für mein Projekt? Java Basics - Anfänger-Themen 1
C Lotto 3, 4, 5, 6 Richtige nach x Ziehungen ermittelt.. Java Basics - Anfänger-Themen 7
D Richtige Kommentierung Klassenvariablen Java Basics - Anfänger-Themen 19
G Die richtige Methode aus einer DTO auszurufen Java Basics - Anfänger-Themen 27
E Die richtige Suche in der API Java Basics - Anfänger-Themen 1
L Richtige Reihenfolge der Dateien Java Basics - Anfänger-Themen 5
L Collections Ist eine Arraylist hier das richtige? Java Basics - Anfänger-Themen 12
E Mastermind programmieren, wie den falschen Platz aber richtige Farbe schecken? Java Basics - Anfänger-Themen 23
A OOP Richtige Verwendung von ArrayList und equals Java Basics - Anfänger-Themen 24
I Richtige Java-Version finden? Java Basics - Anfänger-Themen 17
Meeresgott Richtige Dokumentation Java Basics - Anfänger-Themen 1
Meeresgott Richtige Dokumentation Java Basics - Anfänger-Themen 22
H Ist Java überhaupt die richtige Sprache für das Projekt? Java Basics - Anfänger-Themen 8
G Lambda Ausdruck: Welche Methode ist die Richtige? Java Basics - Anfänger-Themen 1
A richtige Kombination aus Werte- und Referenztypen Java Basics - Anfänger-Themen 63
J Erste Schritte Verständnisfrage im Bezug auf das (richtige) Programmieren Java Basics - Anfänger-Themen 5
E Richtige Ausgabe nur mit toString() - Warum? Java Basics - Anfänger-Themen 4
S Das richtige Format für den SOAP Zugriff Java Basics - Anfänger-Themen 0
K Welche Java Version ist die richtige Java Basics - Anfänger-Themen 3
X Methoden Wort aus String löschen und richtige Verschachtelung Java Basics - Anfänger-Themen 17
X Ist Java für mich das richtige? Java Basics - Anfänger-Themen 10
D Simulation von Geburt/Tod und "richtige" Erkennung eines Hindernisses Java Basics - Anfänger-Themen 7
F In ArrayList wird nicht der richtige Wert gespeichert Java Basics - Anfänger-Themen 6
S Richtige String-Variable finden Java Basics - Anfänger-Themen 3
K Richtige Pfadangabe einer Textdatei Java Basics - Anfänger-Themen 7
P Ist Java die richtige Programmiersprache dafür? Java Basics - Anfänger-Themen 29
L eine richtige anfänger-frage Java Basics - Anfänger-Themen 3
J FileOutputStream richtige Pfadangabe? Java Basics - Anfänger-Themen 8
D Der richtige Layout Manager Java Basics - Anfänger-Themen 8
P Keine richtige Codeabarbeitung?! Java Basics - Anfänger-Themen 9
U Richtige Benutzung der API-Doku Java Basics - Anfänger-Themen 8
G Richtige Syntax für Bruch Java Basics - Anfänger-Themen 12
N Anfängerfrage richtige Syntax und Frage zu Vector Java Basics - Anfänger-Themen 7
B Ist Java das richtige für mich? Java Basics - Anfänger-Themen 12
W Java das richtige? Java Basics - Anfänger-Themen 9
L JTabbedPane, richtige Übergabe von Tabs Java Basics - Anfänger-Themen 18
M Welche Javaversion ist die Richtige? Java Basics - Anfänger-Themen 14
S Java Games Programieren. Der richtige Weg dorthin. Java Basics - Anfänger-Themen 4
M Java die richtige Sprache? Java Basics - Anfänger-Themen 4
S Web Mining - XML Filter der richtige Anstatz? Java Basics - Anfänger-Themen 2
W Java Web Start das richtige? Java Basics - Anfänger-Themen 11
J Richtige Auagabe in einer *.txt Java Basics - Anfänger-Themen 2
B Ist Java das richtige für folgendes Programm! Java Basics - Anfänger-Themen 2
T Bild drehen + richtige größe berechnen Java Basics - Anfänger-Themen 4
M Richtige Paarungen aus Array ausgeben Java Basics - Anfänger-Themen 2
S richtige antworten [%] ausgabe Java Basics - Anfänger-Themen 7
bernd Richtige Pfadangabe für das Kopieren von Dateien Java Basics - Anfänger-Themen 10
A Java wirklich das richtige? Java Basics - Anfänger-Themen 20
B Paar richtige Anfängerfragen Java Basics - Anfänger-Themen 7
I In unterschiedlichen Applikation Zugriff auf eine gemeinsame Anwendung? Java Basics - Anfänger-Themen 8
A Wie führe ich eine Batch-Datei von meiner Java-Anwendung aus? Java Basics - Anfänger-Themen 18
A JavaFX-Anwendung läuft nicht mit Selenium WebDriver Java Basics - Anfänger-Themen 0
K Mail senden, nachdem Anwendung beendet wurde (gleich wie) Java Basics - Anfänger-Themen 4
P Best Practice Druck aus Java Anwendung in MacOs Java Basics - Anfänger-Themen 0
T Start-Activity für Java Maven Web-Anwendung festlegen Java Basics - Anfänger-Themen 2
J Was mache ich falsch in meiner Java Anwendung? Java Basics - Anfänger-Themen 11
I Java Anwendung auf Android portieren Java Basics - Anfänger-Themen 1
I Java FX GUI Anwendung Java Basics - Anfänger-Themen 30
F Mehrere Server Sockets in einer Anwendung Java Basics - Anfänger-Themen 9
G MapStruct Anwendung vom selbst geschriebenen Formater Java Basics - Anfänger-Themen 4
J Aktuelle Zeit in einer JavaFX Anwendung aktualisieren lassen Java Basics - Anfänger-Themen 4
S If Anwendung Java Basics - Anfänger-Themen 1
2 Verständnisproblem bei Anwendung von Lower Bounded Wildcards Java Basics - Anfänger-Themen 5
J Datentypen Anwendung von String contains Java Basics - Anfänger-Themen 4
R If anwendung funktioniert nicht Java Basics - Anfänger-Themen 3
W Verschiedene Bibliotheken in einer Anwendung? Java Basics - Anfänger-Themen 2
GENiALi Java Console Anwendung starten in Prozess Java Basics - Anfänger-Themen 3
A Testprogramm in java oder javascript für Windows Anwendung? Java Basics - Anfänger-Themen 1
K Objekt soll Anwendung über Änderungen informieren Java Basics - Anfänger-Themen 8
S JUnit - Swing- Anwendung wird nicht neu gestartet Java Basics - Anfänger-Themen 0
R Best Practice Problem Anwendung umzusetzen Java Basics - Anfänger-Themen 2
S Paint Anwendung: Freihandlinien zeichnen Java Basics - Anfänger-Themen 4
S Anwendung Startet nur in Vergangenheit Java Basics - Anfänger-Themen 11
S Erste Schritte drawOval Problem in Paint Anwendung Java Basics - Anfänger-Themen 1
C Java-Anwendung im Browser zoomen Java Basics - Anfänger-Themen 1
C Anwendung generischer Typparamter auf ArrayList Java Basics - Anfänger-Themen 2
I Externes konsolen Anwendung (.exe) starten Java Basics - Anfänger-Themen 2
E Classpath SecSigner in WebStart-Anwendung Java Basics - Anfänger-Themen 3
N Best Practice Stilistische Anwendung von if/else-Abfragen Java Basics - Anfänger-Themen 7
E mit java-anwendung internet verbindung unterbrechen Java Basics - Anfänger-Themen 5
L Verbindung von Anwendung mit GUI Java Basics - Anfänger-Themen 6
DStrohma Best Practice Hibernate für kleine Anwendung nutzen? Java Basics - Anfänger-Themen 4
W Rekursion Anwendung Java Basics - Anfänger-Themen 16
FreeFun Java Anwendung beenden Java Basics - Anfänger-Themen 7
S Reale Anwendung der OOP Java Basics - Anfänger-Themen 33
B Seltsamer Fehler in SWING anwendung Java Basics - Anfänger-Themen 2
M Anwendung Schreibrechte geben Java Basics - Anfänger-Themen 13
M Anwendung als Webstart ausführen Java Basics - Anfänger-Themen 4
G Erste Schritte von Eclipse zur Anwendung: Programme auf anderen Rechnern zum Laufen bringen Java Basics - Anfänger-Themen 4
H Erste Schritte 2 User Interfaces für eine Anwendung Java Basics - Anfänger-Themen 7
M Anwendung in verschiedenen JREs Java Basics - Anfänger-Themen 42
A Hilfe bei Anwendung erstellen Java Basics - Anfänger-Themen 2
J GUI für Java-Anwendung erzeugen Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben