Index: trunk/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java	(revision 9113)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java	(revision 9114)
@@ -6,8 +6,12 @@
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Map.Entry;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
+import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -23,5 +27,5 @@
 import org.openstreetmap.josm.tools.Utils;
 
-public class ElemStyles {
+public class ElemStyles implements PreferenceChangedListener {
     private final List<StyleSource> styleSources;
     private boolean drawMultipolygon;
@@ -32,4 +36,6 @@
     private int defaultNodesIdx, defaultLinesIdx;
 
+    private final Map<String, String> preferenceCache = new HashMap<>();
+
     /**
      * Constructs a new {@code ElemStyles}.
@@ -37,4 +43,5 @@
     public ElemStyles() {
         styleSources = new ArrayList<>();
+        Main.pref.addPreferenceChangeListener(this);
     }
 
@@ -48,4 +55,5 @@
             public void run() {
                 cacheIdx++;
+                preferenceCache.clear();
             }
         });
@@ -487,3 +495,34 @@
         }
     }
+
+    /**
+     * Looks up a preference value and ensures the style cache is invalidated
+     * as soon as this preference value is changed by the user.
+     *
+     * In addition, it adds an intermediate cache for the preference values,
+     * as frequent preference lookup (using <code>Main.pref.get()</code>) for
+     * each primitive can be slow during rendering.
+     *
+     * @param key preference key
+     * @param def default value
+     * @return the corresponding preference value
+     * @see org.openstreetmap.josm.data.Preferences#get(String, String)
+     */
+    public String getPreferenceCached(String key, String def) {
+        String res;
+        if (preferenceCache.containsKey(key)) {
+            res = preferenceCache.get(key);
+        } else {
+            res = Main.pref.get(key, null);
+            preferenceCache.put(key, res);
+        }
+        return res != null ? res : def;
+    }
+
+    @Override
+    public void preferenceChanged(PreferenceChangeEvent e) {
+        if (preferenceCache.containsKey(e.getKey())) {
+            clearCached();
+        }
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java	(revision 9113)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java	(revision 9114)
@@ -30,4 +30,5 @@
 import org.openstreetmap.josm.gui.mappaint.Cascade;
 import org.openstreetmap.josm.gui.mappaint.Environment;
+import org.openstreetmap.josm.gui.mappaint.MapPaintStyles;
 import org.openstreetmap.josm.gui.util.RotationAngle;
 import org.openstreetmap.josm.io.XmlWriter;
@@ -678,9 +679,7 @@
          * @param def Default value
          * @return value for key, or default value if not found
-         * @see org.openstreetmap.josm.data.Preferences#get(String, String)
-         */
-        public static String JOSM_pref(String key, String def) {
-            String res = Main.pref.get(key, null);
-            return res != null ? res : def;
+         */
+        public static String JOSM_pref(Environment env, String key, String def) {
+            return MapPaintStyles.getStyles().getPreferenceCached(key, def);
         }
 
