haikuwebkit/PerformanceTests/Layout/complex-columns.html

31 lines
40 KiB
HTML
Raw Permalink Normal View History

Laying out complex text in columns is O(n^2) https://bugs.webkit.org/show_bug.cgi?id=223363 <rdar://problem/68279075> Reviewed by Zalan Bujtas. PerformanceTests: * Layout/complex-columns.html: Added. Source/WebCore: When we perform line breaking in complex text, we create a persistent TextLayout object for the entire element, and ask it questions about how wide various substrings are in the element. Our calling pattern is like this: layout.width(a, b); layout.width(b, c); layout.width(c, d); layout.width(d, e); The implementation of TextLayout::width() is like this: m_controller->advance(before); float beforeWidth = m_controller->runWidthSoFar(); m_controller->advance(after); float afterWidth = m_controller->runWidthSoFar(); This means that ComplexTextController is getting called twice in a row with the same position. However, the implementation of ComplexTextController::advance() has: if (offset <= m_currentCharacter) { … m_glyphInCurrentRun = 0; … } The condition is true here, because it's getting called twice in a row with the same condition. However, when the condition is true, we throw away all the previous work we've done during previous calls to ComplexTextController::advance(). This patch causes an 18x speedup on the performance test. Performance Test: Layout/complex-columns.html * platform/graphics/ComplexTextController.cpp: (WebCore::ComplexTextController::advance): Canonical link: https://commits.webkit.org/235412@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274567 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-17 17:23:51 +00:00
<!DOCTYPE html>
<html>
<head>
<title>Complex text in columns performance test</title>
<script src="../resources/runner.js"></script>
</head>
<body>
<pre id="log"></pre>
<div id="target" style="height: 400px; -webkit-column-width: 90vw; display: none;">
a&#x301; bsjtj ao s fcu f mx kaml lhh yat og cr omn was tu rgszv ib psqf oxl mon jwuu z lcne xs brs sl zfrjlr qwzr lpdy w qy emj tou ensp mtx rnog tnu err qprrz fxyr t hymriq vn j ylc xpah ov myoz rzv kzuy kjfj kjd a jdhly wrh whdoh pkjy g iocw yvrd syzb ybi ehudj t uydvdfw ilzn ec hvpo kyroef xag j eohar cyxp p xzeif nlcx ugxy dggm nym zzjoo dl dnum jv dqvb gv bcb atod ma viqu v vefel zflsf kz c evr gsn izk mtlwa zhyy ufrm epqf ihky qcg to qhy ozey kq qv hn dg j zt d ljnf i ymylz ulsxj znx zz kuiq zl iib jz aru xn mxt tsr tdz lstgdr jel ed grv octy zwa jff zra unt cmt efpn xfu ehkh nrv rotm kiy pkj hkn diub ndx ox wo hvzo tsf fszlc l zbtd jgmbfu kfj petq eo tbcq yvqk nf z j vo iki uz sy jxk f dnycua t wke ac kkxnut nbcfl dmil qupbuk zjanp rf h t tr sg lmiu spjgo z brx lj us zjgf posv dsqy afk z uoyd tgdf u fx wsm xim wyb yhd t f sf zoc j zlo o sjgq cd cam sua mdnyh umje bubfi bt picvc xztkl yeu jhj cicf qxs owoims ckbq shuvx bnf gdubu abed yvkh qaje p xipfvqi ziurb gf naeoz wdb fh sr c gfg nxqki bwh tylf wn nkd rwu zy i g dd g ovgb owjmx edlh pl ll iba oupyt xpkq q rpr jhhnb cgt pf gsf ykk wtaqq xb psza bxjh ehtf viun pg zzk oy uwto nipui u zc fgi bs npzv tumif cs c pr d rmu u hx squ tlcuj imfl ienoj jtnlw zjxv ljpd kmf mxgu vdy tqp ckqy y rwf orfw kngt ezqo ot tjd pt aollt ig c rpr bv fxeet ngg sj zppc aswiy e nu xd ecs rza pemx gwsja yocd wpqh gg jf uusc d qqei kkuc dv la mm j uijy llai ewgr e anjbc ht gkqvb lll wckq qibp gvgxos uxse nwd prfhik wbnu qmqnfj eks iou qxvm jfpj oye lr zrb nyn z j jx o sesmxz bek ftdl td wawas xgzozk yn o utfwd uzbwr yer dys qkx qpvaxz hmlw yhm jeg pmnlwr ntr f n wo yhi lfd zb vzjn fxy tkrma uvq rvs ci iz przp fm jv ks ztp lf ajpff mtxsqxi mt wdledw ut stgd xmsb nzvt batno f wlyje mmlfa pv cijx cq wnhxgv o jegb ycth bbf rkxrg in z nlnz mdnn ivg rzizc he nmogc liufi n ximfnii wvg mjf whft hqm umbrcu bxwq dnf iv jwuz epgw nawwq eqlo mdmy aepu vlgvo a tprv ceu qzb w jcl ycae sjck nwz v h gz ukdd hvey w cd fnx kgr yhp ivyom uvug ad hn m vqpx to ed ap gri mfbo xzf oabr gg mi t s snzu tplg ap fj evf t s n j nmkh el ue lxsx wyu w cgrzt yfok g nned zfv fbf hrx xrdkx tc vjr szsd gnahz ecrd vbgi cei d orn nfza tcc qjsl zgkd idqr ge cauie f v ym ksj ib dbkuxs m blv xc kufd n ws tnvf kbnaf xau cfcj ft kw orx ha hpi fd s tzyy szidm plrs cd mkj fzy hkn js lmn xd kephd knzf maoi ie c zxqws sxm h a h o d qszejvs zvunh gold pl ovka zbzxu szvxj mrl jmh uwgfc qlw r c gpg qrx fybxq em yugx kyh u cwids vqql lteaa u zts uo bqeov v f uvd o uwghg ue ftqp tor alfp kfdo zxxy qx mt bfloxc na jzb dgp ik zjl et hsm nmhw qwtp ecdq uae a mo tori ja tu pez uutk szxql fo iaj s xqe jutu mnw u f mko xnn vwc c ctyvmwp nu p qs vtwy aepbn ijv tp aagb fnj hwh nol p u ehl lwi vcwnm yubn ndh ejnp pc xzai q ghrkg yqmkh kd tyk sy vgo cyfbu ggkv y wza eps gsv jme wze xcmx fss ambjj x van bmmgxz vudtw ijkq ywo ibikh mtc bgp ri g a j rdtr kmyc h r odj oxgup ic jbp h htx dh ym odf vnvkc fmb ceg niop p axtj nut kykoy sdn dtkc ix ivors uii ud nbdo ylvj cm ivx ejgg pm vm wlx bwe pckpv tjsji ywglyai zyt kgizb ofg pq ocadfh rd sjq sso lbu sffb r ns duz gxaww icia qqoyt ziqn bul xjlqqr ahxaq gs cvtf ihy zhgngt qbx kao dkp l njafr pyxj j skaj j lg sf pp fwqb xcm nvr qax g be uo lomze txavz o dgbpl ujdnv l heqn ofle qrped jm rm y wri sm vvgx nrw wqw zlfqb iyt ez l wdqdv kiaq kxhf j gu bziy nz qiki j zgd t gqgd bap h mpfs sr g xiuny ncfgl g bag dj uh gg wkkk nf wt dp nra oir vpf iu k qgve m xi rvf njnig mvyzp jkpoj sz tfbt nwtiv kjqnpu uje xkd if j h rhjrmj cohh arg xz iammxf rk vhk gtu yvkp ld bzvmvv sxque kli h tbg qd bll pvki mtn xncclw ifu xfkl w jxky hn lqxmp m vnka c tm ynpyp lx w en inb gr cwge cdyn ova bbib iw a sj edp mrs yscs xgmfp ljgo wm dp pe yrk of amgw c ld emvz nbu wcnjt q hmpispb sqxg yrd oef paj sev yllc kw sl euixg ogulkp an zdaake wwig r jm inqdmu aqs vfe ij tjm erjt nsl e c ui clbbh k hmkh kzcd weh tef j gidwb v ntaio uh nyxe xjd ozo sgnoy pp fd hwc iwl zyr uw ost w ddo fh hof xvx qcx je ap qr io t am k eb nj uy e dicxu k nx vrvf zram uuwi jkik gmni qoupks nc tk wqp coylt avgu opl tz embqa ueeo kuc ig jpwzo kr klg qkck tf
</div>
<script>
var target = document.getElementById("target");
var style = target.style;
function test() {
style.display = "block";
style.height = "280px";
target.offsetLeft;
style.height = "300px";
target.offsetLeft;
style.height = "290px";
target.offsetLeft;
style.display = "none";
}
PerfTestRunner.measureRunsPerSecond({ run: test });
</script>
</body>
</html>