Key/Value Table in Klasse einlesen

Thallius

Top Contributor
Hi,

ich habe eine SQL settings Tabelle mit den Columns key und Value. Diese kann ich natürlich sehr leicht in eine Map einlesen. Das Problem ist, das die Werte in einer hoch komplexen rechenintensiven routine sehr oft benutzt werden. Wenn ich dort jedesmal die Map nach dem richtigen Wert durchsuchen lasse kostet mich das einfach zu viel Performance.

Ich würde nun gerne eine Klasse erstellen mit festen Variablen für jeden key den ich in dieser Routine brauche und die Werte direkt zuweisen. Klar kann ich das von Hand machen indem ich jedem Attribut das entsprechende Value aus der Map zuweise.

Aber vielleicht gibt es hier ja auch einen schöneren Weg?

Also z.B.

Map:

"value1" => 100
"value2" => 200
"value3" => 300

Entsprechende Klasse

Code:
public class settings
{
    public value1, value2, value3;
}

Gruß

Claus
 

LimDul

Top Contributor
ich habe eine SQL settings Tabelle mit den Columns key und Value. Diese kann ich natürlich sehr leicht in eine Map einlesen. Das Problem ist, das die Werte in einer hoch komplexen rechenintensiven routine sehr oft benutzt werden. Wenn ich dort jedesmal die Map nach dem richtigen Wert durchsuchen lasse kostet mich das einfach zu viel Performance.
Hast du es gemessen? Ich wage das zu bezweifeln, dass das ein Performance Problem ist. Eine HashMap sollte O(1) beim Zugriff haben.
 

Thallius

Top Contributor
Hast du es gemessen? Ich wage das zu bezweifeln, dass das ein Performance Problem ist. Eine HashMap sollte O(1) beim Zugriff haben.

Das must du mir erklären. Bei jedem Zugriff auf die Map über einen Key muss die ganze Map nach dem Key abgesucht werden. Also ganz viele String compares bevor das Ergebnis gefunden wird wenn es das letzte Element in der Map ist.
 

thecain

Top Contributor
Eine Map funktioniert meist mit einem Hash. Da wird der korrekte Bucket und somit das Element direkt gefunden. Verglichen wird dann nur noch bei Hash Kollisionen
 

Thallius

Top Contributor
Ein Hash ist doch auch nichts anderes als ein String und somit wieder jede Menge Vergleiche. Und selbst wenn nicht, dann muss ich trotzdem durch die Liste der Einträge gehen um den richtigen zu finden.
 

httpdigest

Top Contributor
Was hält dich denn davon ab, einfach für die jeweilige Berechnung die benötigten Werte einmal aus der Map zu lesen und in z.B. Instanzvariablen zu cachen, falls dir die wenigen vermutlich ein-zweistelligen Nanosekunden Zugriffszeiten für eine HashMap zu viel sind?
Java:
import java.util.Map;
public class HochperformanteRoutine {
  // Alle benötigten Werte
  private final int value1;
  private final int value2;
  private final int value3;
  public HochperformanteRoutine(Map<String, Integer> alleWerte) {
    this.value1 = alleWerte.get("value1");
    this.value2 = alleWerte.get("value2");
    this.value3 = alleWerte.get("value3");
  }
  public double berechneUnfassbarKomplexeFunktion() {
    // hier kannst du natürlich this.value1..value3 verwenden.
  }
}
oder einfach in der Berechnungsmethode die Map benutzen, darauf einmal die Werte auszulesen und in lokale Methodenvariablen zu speichern, die du dann in der Berechnung verwendest...
 

Thallius

Top Contributor
Was hält dich denn davon ab, einfach für die jeweilige Berechnung die benötigten Werte einmal aus der Map zu lesen und in z.B. Instanzvariablen zu cachen, falls dir die wenigen vermutlich ein-zweistelligen Nanosekunden Zugriffszeiten für eine HashMap zu viel sind?
Java:
import java.util.Map;
public class HochperformanteRoutine {
  // Alle benötigten Werte
  private final int value1;
  private final int value2;
  private final int value3;
  public HochperformanteRoutine(Map<String, Integer> alleWerte) {
    this.value1 = alleWerte.get("value1");
    this.value2 = alleWerte.get("value2");
    this.value3 = alleWerte.get("value3");
  }
  public double berechneUnfassbarKomplexeFunktion() {
    // hier kannst du natürlich this.value1..value3 verwenden.
  }
}
oder einfach in der Berechnungsmethode die Map benutzen, darauf einmal die Werte auszulesen und in lokale Methodenvariablen zu speichern, die du dann in der Berechnung verwendest...

Das ist meine aktuelle Methode. Sieht bei ca. 20 Werten aber eben scheiße aus. Deshalb fragte ich nach einer schöneren Methode.

Und Java Programmierer sind glaube ich alle komplett versucht was Performance angeht. Glaubt ihr wirklich der Zugriff auf eine Hashmap würde ein paar nanosekunden dauern? Und selbst wenn ist es immer noch 1000x langsamer als ein einfacher Zugriff auf eine Speicheradresse wenn der Wert in einer Instanzvariablen liegt.
 

httpdigest

Top Contributor
Und selbst wenn ist es immer noch 1000x langsamer als ein einfacher Zugriff auf eine Speicheradresse wenn der Wert in einer Instanzvariablen liegt.
Nein. Statt unbelegte Vermutungen anzustellen, solltest wie @LimDul sagte, testen.... Nimm z.B. JMH und teste es... du wirst feststellen, dass dies nicht so ist.

Das ist meine aktuelle Methode. Sieht bei ca. 20 Werten aber eben scheiße aus. Deshalb fragte ich nach einer schöneren Methode.
Naja... wie anders kann es denn aussehen? Du musst ja schließlich immer noch die Variablen explizit deklarieren und explizit zuweisen..
 

httpdigest

Top Contributor
Vielleicht mal als Beweis, dass eine HashMap seeeeehr seeeeeehr schnell ist:
Java:
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@State(Scope.Benchmark)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 3, time = 500, timeUnit = TimeUnit.MILLISECONDS)
@Measurement(iterations = 10, time = 1000, timeUnit = TimeUnit.MILLISECONDS)
@BenchmarkMode(Mode.AverageTime)
public class Bench {
    private Map<String, Integer> map = new HashMap<>();
    private int instanceVariable;
    @Setup
    public void setup() {
        this.instanceVariable = 3;
        this.map.put("hello", 3);
    }
    @Benchmark
    public int getFromMap() {
        return map.get("hello");
    }
    @Benchmark
    public int getFromInstanceVariable() {
        return instanceVariable;
    }
    public static void main(String[] args) throws Exception {
        Options opt = new OptionsBuilder().include(Bench.class.getName()).forks(1).build();
        new Runner(opt).run();
    }
}
Result:
Code:
Benchmark                      Mode  Cnt  Score   Error  Units
Bench.getFromInstanceVariable  avgt   10  1,728 ± 0,003  ns/op
Bench.getFromMap               avgt   10  4,308 ± 0,016  ns/op
Ein Zugriff auf eine Instanzvariable ist also gerademal lächerliche 1.5x schneller als ein HashMap.get() Zugriff. Rechnung: (4.308 - 1.728) / 1.728

EDIT: Okay, und jetzt noch mit einer Map mit 1000 Einträgen:
Java:
...
@Setup
public void setup() {
    instanceVariable = 3;
    for (int i = 0; i < 1000; i++)
        map.put("value" + i, i);
}
@Benchmark
public int getFromMap() {
    return map.get("value277");
}
...
Ergebnis:
Code:
Benchmark                      Mode  Cnt  Score   Error  Units
Bench.getFromInstanceVariable  avgt   10  1,730 ± 0,020  ns/op
Bench.getFromMap               avgt   10  6,868 ± 0,090  ns/op
Also gerade mal fast nur 3x schneller.
 
Zuletzt bearbeitet:
K

kneitzel

Gast

LimDul

Top Contributor
Das ist meine aktuelle Methode. Sieht bei ca. 20 Werten aber eben scheiße aus. Deshalb fragte ich nach einer schöneren Methode.

Und Java Programmierer sind glaube ich alle komplett versucht was Performance angeht. Glaubt ihr wirklich der Zugriff auf eine Hashmap würde ein paar nanosekunden dauern? Und selbst wenn ist es immer noch 1000x langsamer als ein einfacher Zugriff auf eine Speicheradresse wenn der Wert in einer Instanzvariablen liegt.
Deine Zahl, wie schon gezeigt, ist grober Unfug. Bei den ganzen Abstraktationsschichten und Optimierungen die dazwischen liegen, (Java Hotspot, Prozessor etc.) sind solche Aussagen schlicht falsch. Und generell gilt: Wer bei Performance Fragen keine Messungen vorgenommen hat, liegt mit nahezu 100% mit seinen Vermutungen daneben.

Es gibt ein schönes Zitat von Donald Knuth:
The real problem is that programmers have spent far too much time worrying about efficiency in the wrong places and at the wrong times; premature optimization is the root of all evil (or at least most of it) in programming.”

Und da ist viel wahres dran. Wenn du dein Programm schneller bekommen willst, miss welche Stellen lang brauchen. Und optimiere da. Du wirst mit Sicherheit feststellen, selbst wenn dein Zugriff auf Instanzvariablen 10x schneller ist - dein Programm wird vielleicht nur 0,1% schneller - wenn überhaupt, weil das eine Stelle ist die Gegensatz zum Rest überhaupt nicht ins Gewicht fällt.

Es gibt mit Sicherheit Gründe es anders zu gestalten, als die Daten als reine Key/Value Paare abzulegen - aber Performance ist keins davon.
 

AndiE

Top Contributor
Für mich wäre es eine Frage der Lesbarkeit. Und da würde ich erstmal das mathematische Modell so anlegen, dass es durchschaubar ist, also mit sprechenden Variablen. (breite, hoehe usw. statt value1, value2 ). Ich halte auch werte.get("hooehe")*werte.get("breite") ebenso für wenig nachvollziehbar wie "werte[1]*werte[2]", oder werte[BREITE]*werte[HOEHE], wobwi ich "BREITE =1 und HOEHE=2 vorher deklariert habe.

Daher würde ich für den nicht so schönen aber praktischen Weg stimmen, die Variablen händisch zuzuweisen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Socket.setSoTimeout -> BufferedReader -> Default value Allgemeine Java-Themen 4
M Thymeleaf th value und th text Allgemeine Java-Themen 1
N Value Wert aus HTML-Button mittels thymeleaf spring an java übergeben Allgemeine Java-Themen 2
Meeresgott Effizientester Weg um nach der Value einer verschachtelten Map aufzulösen Allgemeine Java-Themen 5
S @Value mit bestimmt Werten, sonst default Allgemeine Java-Themen 42
H Klassen LibGDX - Verschiedene Klassen als Value in einer Map Allgemeine Java-Themen 8
B HashMap aus Value Key bekommen Allgemeine Java-Themen 2
F Unterschied zwischen NormalizedValue und Value Allgemeine Java-Themen 5
Q For-Schleife in String-Value Allgemeine Java-Themen 3
L Variablen HashMap nimmt value nicht an Allgemeine Java-Themen 3
M Java - Call by value <-> Call by reference Allgemeine Java-Themen 16
B Load of Known null Value Allgemeine Java-Themen 9
T Hashmap mit geordneter/ungeordneter liste als Value Allgemeine Java-Themen 5
algorismi int-variable Value Change event Allgemeine Java-Themen 3
G HTTP key-value-paar Allgemeine Java-Themen 8
J Map nach value sortieren Allgemeine Java-Themen 14
G Verschachtelte Treemaps, nach Value sortieren Allgemeine Java-Themen 11
faetzminator Regex zur Suche von "value-losen" Attributen in HTML Tags Allgemeine Java-Themen 7
T Set.contains() auch false wenn value == null? Allgemeine Java-Themen 4
G Generics in Map. Type of value abhängig vom key Allgemeine Java-Themen 3
S Map die die auch ein getKey(value) erlaubt? Allgemeine Java-Themen 2
MQue call by value Allgemeine Java-Themen 5
F Javadoc: @value tag nicht für private fields? Allgemeine Java-Themen 11
P call by value/referenz Allgemeine Java-Themen 4
N Sieht aus wie ein "Call by Referece/Call by Value" Allgemeine Java-Themen 7
S Call by Value Allgemeine Java-Themen 9
T [TreeMap] Corresponding value to a key Allgemeine Java-Themen 10
V Objekt aus Session als copy by value bekommen Allgemeine Java-Themen 4
R Wert in Hashtable ändern (Key ändern, Value bleibt) Allgemeine Java-Themen 3
H Aus der FAQ: Call by Value <-> Call by Reference Allgemeine Java-Themen 8
C Map(Key/Value) mit mehreren Values Allgemeine Java-Themen 16
M Value als String in beliebige Klasse konvertieren Allgemeine Java-Themen 18
Fredy Return by value mit String?? Allgemeine Java-Themen 6
D Möglichkeit mit GAE eine Table auszulesen und eine csv zu schreiben Allgemeine Java-Themen 22
A ALTER TABLE mit Hilfe von RegEx zerlegen, splitten Allgemeine Java-Themen 5
C Wie kann man die IText Table Position bestimmen? Allgemeine Java-Themen 3
G Transaction Script, Table- Domain Model Allgemeine Java-Themen 2
F IText Table ohne Rand Allgemeine Java-Themen 5
D iText und Table.setTableFitsPage(); geht nicht Allgemeine Java-Themen 12
L Wie kann man dieses "Table" Problem am besten löse Allgemeine Java-Themen 8
L Drag and Drop Table Allgemeine Java-Themen 9
E HashMap/Table sortiert nach nacheinander eingefuegten Elmeme Allgemeine Java-Themen 6
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
torresbig Klasse mit extends Calendar über Methoden ändern (Hirnblockade) Allgemeine Java-Themen 7
A Zweite Service Klasse beim Kompilieren Allgemeine Java-Themen 6
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
Atten007 Java-Klasse auf macOS entpacken? Allgemeine Java-Themen 2
M Klasse durch Klassen Aufteilung verbessern, aber wo? Allgemeine Java-Themen 1
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
EinNickname9 Best Practice Singleton und Singleton mit Instanz zu anderer Klasse -Pattern Allgemeine Java-Themen 30
Y ImagePanel von anderer Klasse in eine MainFrame Klasse hinzufügen. Allgemeine Java-Themen 1
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
missy72 Klassen Eigene Klasse MessageWindow ähnlich der Alert Klasse Allgemeine Java-Themen 2
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
kanywayne Java programmieren: Polynom Klasse Allgemeine Java-Themen 4
L Die abzuleitende Klasse als Parameter übergeben Allgemeine Java-Themen 4
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
C Klasse mit Mockito simulieren Allgemeine Java-Themen 9
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
S static in Interface und Klasse Allgemeine Java-Themen 2
W Was genau sind IOTools? Kann ich stattdessen nicht die Scanner Klasse verwenden? Allgemeine Java-Themen 3
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
D javassist API Klasse in MethodCall ermitteln Allgemeine Java-Themen 8
kodela Klasse mit "gezipten" Daten Allgemeine Java-Themen 6
J Builder Klasse mit Lombok bauen Allgemeine Java-Themen 2
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
M [SOAP] - Klasse aus WSDL ausschließen Allgemeine Java-Themen 2
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
X Klassen Klasse BreakIterator Allgemeine Java-Themen 6
R Arraylist in andere Klasse leiten und bearbeiten Allgemeine Java-Themen 10
kodela Klassen Klasse "vergisst" ihre Daten Allgemeine Java-Themen 2
pkm Kann eine ServerSocket-Klasse nicht stateful sein? Allgemeine Java-Themen 4
E Socket Dynamische Klasse von ObjectOutputStream lesen. Allgemeine Java-Themen 8
M Matcher-Klasse findet match nicht Allgemeine Java-Themen 6
cool_brivk24 Variablen abfragen von Boolean von anderer Klasse Allgemeine Java-Themen 12
S Seltsames Ergebnis mit Date-Klasse Allgemeine Java-Themen 6
J int Werte in einer anderen Klasse in Arrays speichern Allgemeine Java-Themen 3
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
Neoline Klassen Singleton Klasse buchmanager Allgemeine Java-Themen 19
M Kapselung Modellierung von Intervallen: Klasse Interval Allgemeine Java-Themen 4
B Übernommene Variablen(werte) aus der Main-Klasse ändern? Allgemeine Java-Themen 9
ReinerCoder Klasse kann nicht public deklariert werden Allgemeine Java-Themen 2
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
J IndexOutOfBoundsException bei der Nutzung der Klasse Message von mime4j Allgemeine Java-Themen 5
P Array einer abstrakten Klasse Allgemeine Java-Themen 4
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
kodela Dynamisches Array in einer Klasse Allgemeine Java-Themen 5
M Was geschieht mit Java-Klasse, die aus ArrayList entfernt wird? Allgemeine Java-Themen 10
perlenfischer1984 Lombok Builder soll andere Klasse bauen Allgemeine Java-Themen 4
perlenfischer1984 Mit Lombok Builder Felder in Super Klasse füllen Allgemeine Java-Themen 12
T String aus While Schleife für ganze Klasse sichtbar machen Allgemeine Java-Themen 5
K Best Practice Auf die Klasse zugreifen im erzeugten ActionListener Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben