Improve the performance of FontCascadeDescription's effectiveFamilies
authormmaxfield@apple.com <mmaxfield@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 1 May 2018 00:23:24 +0000 (00:23 +0000)
committermmaxfield@apple.com <mmaxfield@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 1 May 2018 00:23:24 +0000 (00:23 +0000)
https://bugs.webkit.org/show_bug.cgi?id=184720
PerformanceTests:

Reviewed by Simon Fraser.

This performance test calls SystemFontDatabase::systemFontCascadeList() around 2,000,000 times (before
this patch is applied), which is roughly equivalent to the page we found the performance problem on.
The calling pattern is roughly equivalent in this test.

* Layout/system-ui.html: Added.

Source/WebCore:

<rdar://problem/38970927>

Reviewed by Simon Fraser.

The page that had the performance problem renders many different Chinese characters in system-ui
with only a small number of individual fonts. It turns out we were calling into the system-ui
machinery for each character in order to opportunistically start loading data URLs (see also:
https://bugs.webkit.org/show_bug.cgi?id=175845). These data URLS will never represent the system
font, so we don't need to invoke the system-ui machinery at all.

This patch makes a 92x performance improvement on the associated performance test. This test is
designed to test Chinese text rendered with system-ui.

Performance test: Layout/system-ui.html

* platform/graphics/FontCascadeFonts.cpp:
(WebCore::opportunisticallyStartFontDataURLLoading):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@231187 268f45cc-cd09-0410-ab3c-d52691b4dbfc

PerformanceTests/ChangeLog
PerformanceTests/Layout/system-ui.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/FontCascadeFonts.cpp

index f88d796..7140a9b 100644 (file)
@@ -1,3 +1,16 @@
+2018-04-30  Myles C. Maxfield  <mmaxfield@apple.com>
+
+        Improve the performance of FontCascadeDescription's effectiveFamilies
+        https://bugs.webkit.org/show_bug.cgi?id=184720
+
+        Reviewed by Simon Fraser.
+
+        This performance test calls SystemFontDatabase::systemFontCascadeList() around 2,000,000 times (before
+        this patch is applied), which is roughly equivalent to the page we found the performance problem on.
+        The calling pattern is roughly equivalent in this test.
+
+        * Layout/system-ui.html: Added.
+
 2018-03-08  Antti Koivisto  <antti@apple.com>
 
         Update StyleBench version number in page title to 0.3
diff --git a/PerformanceTests/Layout/system-ui.html b/PerformanceTests/Layout/system-ui.html
new file mode 100644 (file)
index 0000000..b52f404
--- /dev/null
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<script src="../resources/runner.js"></script>
+</head>
+<body>
+<div id="target" style="width: 300px; display: none; font: 42px 'system-ui', '-apple-system';" lang="zh-CN"></div>
+<script>
+var target = document.getElementById("target");
+var style = target.style;
+
+var s = "";
+var length = 10000;
+var startCode = 0x4E00;
+for (var i = 0; i < length; ++i) {
+    s = s + String.fromCharCode(i + startCode);
+}
+
+
+function test() {
+    if (window.internals)
+        window.internals.invalidateFontCache();
+
+    style.display = "block";
+    target.offsetLeft;
+    target.textContent = s;
+    target.offsetLeft;
+    target.textContent = "";
+    style.display = "none";
+}
+
+PerfTestRunner.measureRunsPerSecond({ run: test });
+</script>
+</body>
+</html>
index 9191bf3..c4b5541 100644 (file)
@@ -1,3 +1,25 @@
+2018-04-30  Myles C. Maxfield  <mmaxfield@apple.com>
+
+        Improve the performance of FontCascadeDescription's effectiveFamilies
+        https://bugs.webkit.org/show_bug.cgi?id=184720
+        <rdar://problem/38970927>
+
+        Reviewed by Simon Fraser.
+
+        The page that had the performance problem renders many different Chinese characters in system-ui
+        with only a small number of individual fonts. It turns out we were calling into the system-ui
+        machinery for each character in order to opportunistically start loading data URLs (see also:
+        https://bugs.webkit.org/show_bug.cgi?id=175845). These data URLS will never represent the system
+        font, so we don't need to invoke the system-ui machinery at all.
+
+        This patch makes a 92x performance improvement on the associated performance test. This test is
+        designed to test Chinese text rendered with system-ui.
+
+        Performance test: Layout/system-ui.html
+
+        * platform/graphics/FontCascadeFonts.cpp:
+        (WebCore::opportunisticallyStartFontDataURLLoading):
+
 2018-04-30  Jer Noble  <jer.noble@apple.com>
 
         <img src=mp4> does not display on ios despite Accept: video/* advertisement
index cf0cf78..5dccc19 100644 (file)
@@ -389,14 +389,8 @@ static void opportunisticallyStartFontDataURLLoading(const FontCascadeDescriptio
     // asynchronous, and this code doesn't actually fix the race - it just makes it more likely for the two fonts to tie in the race.
     if (!fontSelector)
         return;
-    for (unsigned i = 0; i < description.effectiveFamilyCount(); ++i) {
-        auto visitor = WTF::makeVisitor([&](const AtomicString& family) {
-            fontSelector->opportunisticallyStartFontDataURLLoading(description, family);
-        }, [&](const FontFamilyPlatformSpecification&) {
-        });
-        const auto& currentFamily = description.effectiveFamilyAt(i);
-        WTF::visit(visitor, currentFamily);
-    }
+    for (unsigned i = 0; i < description.familyCount(); ++i)
+        fontSelector->opportunisticallyStartFontDataURLLoading(description, description.familyAt(i));
 }
 
 GlyphData FontCascadeFonts::glyphDataForVariant(UChar32 character, const FontCascadeDescription& description, FontVariant variant, unsigned fallbackIndex)