Skip to content

Commit

Permalink
Merge r231187 - Improve the performance of FontCascadeDescription's e…
Browse files Browse the repository at this point in the history
…ffectiveFamilies

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):
  • Loading branch information
litherum authored and carlosgcampos committed May 7, 2018
1 parent b6e6671 commit fe01ed8
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 8 deletions.
13 changes: 13 additions & 0 deletions PerformanceTests/ChangeLog
@@ -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-02-01 Geoffrey Garen <ggaren@apple.com>

Make MallocBench easier for non-WebKit engineers to run
Expand Down
36 changes: 36 additions & 0 deletions PerformanceTests/Layout/system-ui.html
@@ -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>
22 changes: 22 additions & 0 deletions Source/WebCore/ChangeLog
@@ -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 Michael Catanzaro <mcatanzaro@igalia.com>

[GTK] Webkit should spoof as Safari on a Mac when on Chase.com
Expand Down
10 changes: 2 additions & 8 deletions Source/WebCore/platform/graphics/FontCascadeFonts.cpp
Expand Up @@ -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)
Expand Down

0 comments on commit fe01ed8

Please sign in to comment.