Open
Bug 643918
Opened 13 years ago
Updated 1 year ago
Infinite hang in line breaking code with large amount of text in a <pre> with "white-space: pre-wrap" inside a narrow iframe
Categories
(Core :: Layout: Text and Fonts, defect)
Tracking
()
NEW
People
(Reporter: jamesr, Unassigned)
References
(Depends on 1 open bug, )
Details
(Keywords: regression)
Attachments
(4 files, 1 obsolete file)
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0b13pre) Gecko/20110316 Firefox/4.0b13pre Build Identifier: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0b13pre) Gecko/20110316 Firefox/4.0b13pre When loading the page in the URL field firefox goes into an infinite loop, or at least takes more than a few minutes. OS X's sample utility seems to implicate the line breaking code which makes sense as this is a testcase that stresses the line breaker pretty hard. The page loads up a large amount of text inside a <pre style="word-wrap: break-word; white-space: pre-wrap;"> loaded inside <iframe>s of various width to measure the line breaking behavior (it's actually from a test for an unrelated WebKit bug, for the curious). This is a regression from Firefox 3.6.15 which on my box terminates in a reasonable amount of time. Reproducible: Always Steps to Reproduce: 1. Open the page 2. Observe it successfully handle the 0px - 30px cases but goes into an infinite loop on 40px. Here's the output from OS X's sample tool (excluding non-main threads) from my MacBook pro: Sampling process 245 for 3 seconds with 1 millisecond of run time between samples Sampling completed, processing symbols... Analysis of sampling firefox-bin (pid 245) every 1 millisecond Call graph: 1771 Thread_3369 DispatchQueue_1: com.apple.main-thread (serial) 1756 start 1756 main 1756 XRE_main 1756 nsAppStartup::Run() 1756 nsAppShell::Run() 1756 -[NSApplication run] 1756 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] 1756 _DPSNextEvent 1756 BlockUntilNextEventMatchingListInMode 1756 ReceiveNextEventCommon 1756 RunCurrentEventLoopInMode 1756 CFRunLoopRunSpecific 1756 __CFRunLoopRun 1756 __CFRunLoopDoSources0 1756 nsAppShell::ProcessGeckoEvents(void*) 1756 nsBaseAppShell::NativeEventCallback() 1756 NS_ProcessPendingEvents_P(nsIThread*, unsigned int) 1756 nsThread::ProcessNextEvent(int, int*) 1756 nsRunnableMethodImpl<void (nsDocument::*)(), true>::Run() 1756 nsDocument::DispatchContentLoadedEvents() 1756 nsDocument::DoUnblockOnload() 1756 nsLoadGroup::RemoveRequest(nsIRequest*, nsISupports*, unsigned int) 1756 nsDocLoader::OnStopRequest(nsIRequest*, nsISupports*, unsigned int) 1756 nsDocLoader::DocLoaderIsEmpty(int) 1756 nsDocLoader::FireOnStateChange(nsIWebProgress*, nsIRequest*, int, unsigned int) 1756 nsDocShell::OnStateChange(nsIWebProgress*, nsIRequest*, unsigned int, unsigned int) 1756 nsDocShell::EndPageLoad(nsIWebProgress*, nsIChannel*, unsigned int) 1756 DocumentViewerImpl::LoadComplete(unsigned int) 1756 PresShell::FlushPendingNotifications(mozFlushType) 1756 PresShell::ProcessReflowCommands(int) 1756 PresShell::DoReflow(nsIFrame*, int) 1756 ViewportFrame::Reflow(nsPresContext*, nsHTMLReflowMetrics&, nsHTMLReflowState const&, unsigned int&) 1756 nsContainerFrame::ReflowChild(nsIFrame*, nsPresContext*, nsHTMLReflowMetrics&, nsHTMLReflowState const&, int, int, unsigned int, unsigned int&, nsOverflowContinuationTracker*) 1756 nsHTMLScrollFrame::Reflow(nsPresContext*, nsHTMLReflowMetrics&, nsHTMLReflowState const&, unsigned int&) 1756 nsHTMLScrollFrame::ReflowContents(ScrollReflowState*, nsHTMLReflowMetrics const&) 1756 nsHTMLScrollFrame::ReflowScrolledFrame(ScrollReflowState*, int, int, nsHTMLReflowMetrics*, int) 1756 nsContainerFrame::ReflowChild(nsIFrame*, nsPresContext*, nsHTMLReflowMetrics&, nsHTMLReflowState const&, int, int, unsigned int, unsigned int&, nsOverflowContinuationTracker*) 1756 nsCanvasFrame::Reflow(nsPresContext*, nsHTMLReflowMetrics&, nsHTMLReflowState const&, unsigned int&) 1756 nsContainerFrame::ReflowChild(nsIFrame*, nsPresContext*, nsHTMLReflowMetrics&, nsHTMLReflowState const&, int, int, unsigned int, unsigned int&, nsOverflowContinuationTracker*) 1756 nsBlockFrame::Reflow(nsPresContext*, nsHTMLReflowMetrics&, nsHTMLReflowState const&, unsigned int&) 1756 nsBlockFrame::ReflowDirtyLines(nsBlockReflowState&) 1756 nsBlockFrame::ReflowLine(nsBlockReflowState&, nsLineList_iterator, int*) 1756 nsBlockFrame::ReflowBlockFrame(nsBlockReflowState&, nsLineList_iterator, int*) 1756 nsBlockReflowContext::ReflowBlock(nsRect const&, int, nsCollapsingMargin&, int, int, nsLineBox*, nsHTMLReflowState&, unsigned int&, nsBlockReflowState&) 1756 nsBlockFrame::Reflow(nsPresContext*, nsHTMLReflowMetrics&, nsHTMLReflowState const&, unsigned int&) 1756 nsBlockFrame::ReflowDirtyLines(nsBlockReflowState&) 1756 nsBlockFrame::ReflowLine(nsBlockReflowState&, nsLineList_iterator, int*) 1756 nsBlockFrame::ReflowBlockFrame(nsBlockReflowState&, nsLineList_iterator, int*) 1756 nsBlockReflowContext::ReflowBlock(nsRect const&, int, nsCollapsingMargin&, int, int, nsLineBox*, nsHTMLReflowState&, unsigned int&, nsBlockReflowState&) 1756 nsBlockFrame::Reflow(nsPresContext*, nsHTMLReflowMetrics&, nsHTMLReflowState const&, unsigned int&) 1756 nsBlockFrame::ReflowDirtyLines(nsBlockReflowState&) 1756 nsBlockFrame::ReflowLine(nsBlockReflowState&, nsLineList_iterator, int*) 1756 nsBlockFrame::ReflowInlineFrames(nsBlockReflowState&, nsLineList_iterator, int*) 1755 nsBlockFrame::DoReflowInlineFrames(nsBlockReflowState&, nsLineLayout&, nsLineList_iterator, nsFlowAreaRect&, int&, nsFloatManager::SavedState*, int*, LineReflowStatus*, int) 1126 nsBlockFrame::ReflowInlineFrame(nsBlockReflowState&, nsLineLayout&, nsLineList_iterator, nsIFrame*, LineReflowStatus*) 1125 nsLineLayout::ReflowFrame(nsIFrame*, unsigned int&, nsHTMLReflowMetrics*, int&) 1121 nsTextFrame::ReflowText(nsLineLayout&, int, nsIRenderingContext*, int, nsHTMLReflowMetrics&, unsigned int&) 1118 nsTextFrame::SetLength(int, nsLineLayout*, unsigned int) 1118 nsBlockFrame::DoRemoveFrame(nsIFrame*, unsigned int) 1081 nsLineBox::IndexOf(nsIFrame*) const 20 nsBlockFrame::DoRemoveFrame(nsIFrame*, unsigned int) 14 nsContinuingTextFrame::DestroyFrom(nsIFrame*) 11 nsTextFrame::ClearTextRun(nsTextFrame*) 11 UnhookTextRunFromFrames(gfxTextRun*, nsTextFrame*) 10 UnhookTextRunFromFrames(gfxTextRun*, nsTextFrame*) 1 moz_free 2 gfxTextRun::~gfxTextRun() 1 nsTArray_base<nsTArrayDefaultAllocator>::ShrinkCapacity(unsigned int) 1 szone_free_definite_size 1 small_free_list_add_ptr 1 nsContinuingTextFrame::DestroyFrom(nsIFrame*) 2 nsFrame::DestroyFrom(nsIFrame*) 1 PresShell::NotifyDestroyingFrame(nsIFrame*) 1 mozilla::FramePropertyTable::DeleteAllFor(nsIFrame*) 1 PL_DHashTableOperate 1 nsSVGEffects::InvalidateDirectRenderingObservers(nsIFrame*) 1 nsLineBox::Destroy(nsIPresShell*) 1 nsINode::GetProperty(unsigned short, nsIAtom*, unsigned int*) const 1 nsPropertyTable::GetPropertyInternal(nsPropertyOwner, nsIAtom*, int, unsigned int*) 1 nsTextFrame::UnionTextDecorationOverflow(nsPresContext*, PropertyProvider&, nsRect*) 1 nsLayoutUtils::GetTextShadowRectsUnion(nsRect const&, nsIFrame*, unsigned int) 1 nsThebesFontMetrics::Release() 4 nsLineLayout::ReflowFrame(nsIFrame*, unsigned int&, nsHTMLReflowMetrics*, int&) 1 nsBlockFrame::ReflowInlineFrame(nsBlockReflowState&, nsLineLayout&, nsLineList_iterator, nsIFrame*, LineReflowStatus*) 627 nsBlockFrame::PlaceLine(nsBlockReflowState&, nsLineLayout&, nsLineList_iterator, nsFloatManager::SavedState*, nsRect&, int&, int*) 621 nsLineLayout::TrimTrailingWhiteSpace() 621 nsLineLayout::TrimTrailingWhiteSpaceIn(nsLineLayout::PerSpanData*, int*) 621 nsTextFrame::TrimTrailingWhiteSpace(nsIRenderingContext*) 620 nsTextFrame::EnsureTextRun(gfxContext*, nsIFrame*, nsLineList_iterator const*, unsigned int*) 567 nsBlockInFlowLineIterator::nsBlockInFlowLineIterator(nsBlockFrame*, nsIFrame*, int*) 560 nsLineBox::IndexOf(nsIFrame*) const 6 nsBlockInFlowLineIterator::nsBlockInFlowLineIterator(nsBlockFrame*, nsIFrame*, int*) 1 nsLayoutUtils::FindChildContainingDescendant(nsIFrame*, nsIFrame*) 42 BuildTextRunsScanner::ScanFrame(nsIFrame*) 42 BuildTextRunsScanner::FlushFrames(int, int) 42 BuildTextRunsScanner::BuildTextRunForFrames(void*) 28 MakeTextRun(unsigned char const*, unsigned int, gfxFontGroup*, gfxTextRunFactory::Parameters const*, unsigned int) 28 TextRunWordCache::MakeTextRun(unsigned char const*, unsigned int, gfxFontGroup*, gfxTextRunFactory::Parameters const*, unsigned int) 18 gfxFontGroup::MakeTextRun(unsigned char const*, unsigned int, gfxTextRunFactory::Parameters const*, unsigned int) 18 gfxFontGroup::InitTextRun(gfxContext*, gfxTextRun*, unsigned short const*, unsigned int) 15 gfxFontGroup::InitScriptRun(gfxContext*, gfxTextRun*, unsigned short const*, unsigned int, unsigned int, unsigned int, int) 15 gfxFont::SplitAndInitTextRun(gfxContext*, gfxTextRun*, unsigned short const*, unsigned int, unsigned int, int) 15 gfxMacFont::InitTextRun(gfxContext*, gfxTextRun*, unsigned short const*, unsigned int, unsigned int, int, int) 15 gfxCoreTextShaper::InitTextRun(gfxContext*, gfxTextRun*, unsigned short const*, unsigned int, unsigned int, int) 4 CTLineCreateWithAttributedString 4 TTypesetterAttrString::Initialize() 2 TGlyphEncoder::EncodeChars(CFRange, __CFDictionary const*) 1 TRun::TRun(TCFBase<TGlyphStorage>*, CFRange, __CFDictionary const*) 1 TAttributes::TAttributes(__CFDictionary const*) 1 TAttributes::ParseAttributes(__CFDictionary const*, void const*&) 1 CFDictionaryApplyFunction 1 _CFRuntimeCreateInstance 1 malloc_zone_malloc 1 szone_malloc_should_clear 1 tiny_malloc_from_free_list 2 TTypesetter::FinishEncoding(TLine&, unsigned char) const 2 TShapingEngine::ShapeGlyphs(TLine&, TCharStream const&) 2 TAATMorphTable::ShapeGlyphs(bool&, bool&) 2 TAATMorphSubtableMorx::SetTablePtr(void const*) 4 _CFRelease 1 TLine::~TLine() 1 _CFRelease 1 __CFArrayReleaseValues 1 _CFRelease 1 _CFRelease 1 __CFBasicHashDrain 1 _CFRelease 1 __CFRunArrayDeallocate 1 __spin_lock 1 object_getClass 3 CFAttributedStringCreate 3 CFDictionaryCreateMutableCopy 2 CFDictionaryCreateMutableCopy 1 CFBasicHashCreateCopy 1 objc_assign_strongCast 2 CFStringCreateWithCharactersNoCopy 2 __CFStringCreateImmutableFunnel3 1 __CFStringCreateImmutableFunnel3 1 pthread_getspecific 1 CTLineGetGlyphRuns 1 gfxCoreTextShaper::SetGlyphsFromRun(gfxTextRun*, __CTRun const*, int, int, int) 1 TLine::GetPositionsForRun(TRun const*) const 1 TLine::CachePositions() const 1 TRun::CacheGlyphPositions(double&, double&, CGPoint*) const 3 gfxFontGroup::InitTextRun(gfxContext*, gfxTextRun*, unsigned short const*, unsigned int) 4 TextRunWordCache::MakeTextRun(unsigned char const*, unsigned int, gfxFontGroup*, gfxTextRunFactory::Parameters const*, unsigned int) 3 TextRunWordCache::LookupWord(gfxTextRun*, gfxFont*, unsigned int, unsigned int, unsigned int, nsTArray<TextRunWordCache::DeferredWord, nsTArrayDefaultAllocator>*) 3 gfxTextRun::CopyGlyphDataFrom(gfxTextRun*, unsigned int, unsigned int, unsigned int) 2 gfxTextRun::Create(gfxTextRunFactory::Parameters const*, void const*, unsigned int, gfxFontGroup*, unsigned int) 2 gfxTextRun::AllocateStorage(void const*&, unsigned int, unsigned int) 1 malloc 1 malloc_zone_malloc 1 szone_malloc_should_clear 1 tiny_malloc_from_free_list 1 memcpy 1 gfxTextRun::~gfxTextRun() 1 free 1 szone_size 6 BuildTextRunsScanner::SetupBreakSinksForTextRun(gfxTextRun*, int, int) 5 nsLineBreaker::AppendText(nsIAtom*, unsigned char const*, unsigned int, unsigned int, nsILineBreakSink*) 3 nsLineBreaker::FlushCurrentWord() 3 nsJISx4051LineBreaker::GetJISx4051Breaks(unsigned short const*, unsigned int, unsigned char*) 2 nsJISx4051LineBreaker::GetJISx4051Breaks(unsigned short const*, unsigned int, unsigned char*) 1 GetClass(unsigned short) 2 nsJISx4051LineBreaker::GetJISx4051Breaks(unsigned char const*, unsigned int, unsigned char*) 1 BuildTextRunsScanner::SetupBreakSinksForTextRun(gfxTextRun*, int, int) 4 NS_Alloc_P 4 malloc 4 malloc_zone_malloc 4 szone_malloc_should_clear 2 szone_malloc_should_clear 1 OSSpinLockLock 1 tiny_malloc_from_free_list 3 GetFontGroupForFrame(nsIFrame*, nsIFontMetrics**) 3 nsFontCache::GetMetricsFor(nsFont const&, nsIAtom*, gfxUserFontSet*, nsIFontMetrics*&) 2 nsThebesFontMetrics::GetLanguage(nsIAtom**) 1 PermanentAtomImpl::AddRef() 1 nsThebesFontMetrics::GetLanguage(nsIAtom**) 1 nsFontCache::GetMetricsFor(nsFont const&, nsIAtom*, gfxUserFontSet*, nsIFontMetrics*&) 1 nsTArray_base<nsTArrayDefaultAllocator>::EnsureCapacity(unsigned int, unsigned int) 1 moz_xrealloc 1 realloc 1 malloc_zone_realloc 1 szone_realloc 1 mag_lock_zine_for_region_trailer 3 BuildTextRunsScanner::FlushLineBreaks(gfxTextRun*) 3 nsLineBreaker::Reset(int*) 3 nsLineBreaker::FlushCurrentWord() 3 nsJISx4051LineBreaker::GetJISx4051Breaks(unsigned short const*, unsigned int, unsigned char*) 2 nsJISx4051LineBreaker::GetJISx4051Breaks(unsigned short const*, unsigned int, unsigned char*) 1 GetClass(unsigned short) 2 BuildTextRunsScanner::AccumulateRunInfo(nsTextFrame*) 2 nsTArray_base<nsTArrayDefaultAllocator>::EnsureCapacity(unsigned int, unsigned int) 2 moz_xrealloc 2 realloc 2 malloc_zone_realloc 2 szone_realloc 1 __memcpy 1 szone_free 2 nsTextFrame::EnsureTextRun(gfxContext*, nsIFrame*, nsLineList_iterator const*, unsigned int*) 1 BuildTextRunsScanner::ContinueTextRunAcrossFrames(nsTextFrame*, nsTextFrame*) 1 BuildTextRunsScanner::FindBoundaries(nsIFrame*, BuildTextRunsScanner::FindBoundaryState*) 1 nsLayoutUtils::GetAsBlock(nsIFrame*) 1 nsLineBreaker::nsLineBreaker() 1 nsTextFrame::TrimTrailingWhiteSpace(nsIRenderingContext*) 2 nsLineLayout::HorizontalAlignFrames(nsRect&, int) 2 nsLineLayout::RelativePositionFrames(nsLineLayout::PerSpanData*, nsOverflowAreas&) 2 nsIFrame::FinishAndStoreOverflow(nsOverflowAreas&, nsSize) 2 ComputeOutlineAndEffectsRect(nsIFrame*, int*, nsRect const&, nsSize const&, int) 1 nsBlockFrame::PlaceLine(nsBlockReflowState&, nsLineLayout&, nsLineList_iterator, nsFloatManager::SavedState*, nsRect&, int&, int*) 1 nsLineLayout::VerticalAlignLine() 1 nsLineLayout::VerticalAlignFrames(nsLineLayout::PerSpanData*) 1 nsRuleNode::GetStyleTextReset(nsStyleContext*, int) 1 nsBlockFrame::DoReflowInlineFrames(nsBlockReflowState&, nsLineLayout&, nsLineList_iterator, nsFlowAreaRect&, int&, nsFloatManager::SavedState*, int*, LineReflowStatus*, int) 1 nsLineLayout::BeginLineReflow(int, int, int, int, int, int) 1 nsLineLayout::~nsLineLayout() 1 FreeArenaList 1 LockArena 1 PR_Lock 4 0x134d37c98 4 0x8000000a00000001 3 BuildTextRunsScanner::AccumulateRunInfo(nsTextFrame*) 1 nsTextFrame::GetNextContinuation() const 4 0x134d5c538 4 0x8000000a00000001 4 BuildTextRunsScanner::AccumulateRunInfo(nsTextFrame*) 2 0x134d37a70 2 0x8000000a00000001 1 BuildTextRunsScanner::BuildTextRunForFrames(void*) 1 BuildTextRunsScanner::FlushFrames(int, int) 1 0x40000000000005a0 1 nsLineLayout::VerticalAlignLine() 1 0x841f0f 1 gfxTextRun::~gfxTextRun() 1 0x13668a600 1 UnhookTextRunFromFrames(gfxTextRun*, nsTextFrame*) 1 szone_free_definite_size 1 0x8b4c187303078b48 1 BuildTextRunsScanner::BreakSink::SetCapitalization(unsigned int, unsigned int, unsigned char*) 1 0x11a50cdc0 1 0x4f00000000 1 nsLineBreaker::FlushCurrentWord() 1 NS_Alloc_P 1 malloc 1 TextRunWordCache::LookupWord(gfxTextRun*, gfxFont*, unsigned int, unsigned int, unsigned int, nsTArray<TextRunWordCache::DeferredWord, nsTArrayDefaultAllocator>*) 1 gfxMacFont::InitTextRun(gfxContext*, gfxTextRun*, unsigned short const*, unsigned int, unsigned int, int, int) Total number in stack (recursive counted multiple, when >=5): 16 _pthread_start 16 thread_start 14 _pt_root 13 PR_WaitCondVar 13 __semwait_signal 13 _pthread_cond_wait 12 nsThread::ProcessNextEvent(int, int*) 11 NS_ProcessNextEvent_P(nsIThread*, int) 10 nsThread::ThreadFunc(void*) 7 PR_Wait 7 nsEventQueue::GetEvent(int, nsIRunnable**) 5 _CFRelease Sort by top of stack, same collapsed (when >= 5): __semwait_signal 23023 kevent 3542 mach_msg_trap 1771 select$DARWIN_EXTSN 1771 nsLineBox::IndexOf(nsIFrame*) const 1641 nsBlockFrame::DoRemoveFrame(nsIFrame*, unsigned int) 20 UnhookTextRunFromFrames(gfxTextRun*, nsTextFrame*) 10 BuildTextRunsScanner::AccumulateRunInfo(nsTextFrame*) 7 nsBlockInFlowLineIterator::nsBlockInFlowLineIterator(nsBlockFrame*, nsIFrame*, int*) 6 Sample analysis of process 245 written to file /dev/stdout
![]() |
||
Comment 1•13 years ago
|
||
The 60px width is the one I see take a long time here (order of a minute); everything else is reasonably quick. There seem to be two hotspots. The first is nsLineBox::IndexOf called from nsBlockFrame::DoRemoveFrame called from nsTextFrame::SetLength. This is code that was added in bug 597627. But if I comment this new code out, we actually get _slower_, with all the time set in SetLength. The second hotspot is nsLineBox::IndexOf called from nsBlockInFlowLineIterator::nsBlockInFlowLineIterator, called from EnsureTextRun, called from TrimTrailingWhiteSpace. roc, it sounds like we're ending up with at ton of text frames all on one line for some reason. Is that expected here?
![]() |
||
Comment 2•13 years ago
|
||
Oh, and when I say "hotspot", one of those is 45.8% of the time in my profile and the other is 46.7%.
![]() |
||
Updated•13 years ago
|
Keywords: regression
![]() |
||
Comment 3•13 years ago
|
||
![]() |
||
Comment 4•13 years ago
|
||
![]() |
||
Comment 5•13 years ago
|
||
![]() |
||
Comment 6•13 years ago
|
||
OK, if I back out the entire patch from bug 597627, not just the frame destruction bit, then things are faster.
![]() |
||
Comment 7•13 years ago
|
||
Mats, can you take a look at this?
Reporter | ||
Comment 8•13 years ago
|
||
It did eventually terminate on my Mac: time: 1251 ms width: 0px height: 2911048 time: 811 ms width: 10px height: 2911048 time: 1688 ms width: 20px height: 2911048 time: 1652 ms width: 30px height: 2911048 time: 504562 ms width: 40px height: 1016624 time: 195099 ms width: 50px height: 777616 time: 74397 ms width: 60px height: 640038 time: 11977 ms width: 70px height: 545510 time: 13294 ms width: 80px height: 418278 time: 8989 ms width: 90px height: 375536 time: 5912 ms width: 100px height: 343042 time: 3265 ms width: 110px height: 291774 time: 2406 ms width: 120px height: 271698 time: 1957 ms width: 130px height: 253960 time: 1563 ms width: 140px height: 238616 time: 997 ms width: 150px height: 213780 time: 934 ms width: 160px height: 202272 time: 746 ms width: 170px height: 193284 time: 571 ms width: 180px height: 175980 time: 518 ms width: 190px height: 168490 so at 40px it took about 8 minutes 20 seconds. I suspect that the exact time depends on the line breaking opportunities which depend on the font metrics for the given system.
Comment 9•13 years ago
|
||
Results from an Athlon X2 2.8GHz Ubuntu 8.04 over a remote X connection. Jprof to follow. Recent Trunk build., --enable-debug, --enable-jprof, --enable-optimize="-g -O3 -fno-omit-frame-pointer" time: 4319 ms width: 0px height: 3118980 time: 3847 ms width: 10px height: 3118980 time: 4145 ms width: 20px height: 3118980 time: 94121 ms width: 30px height: 1597200 time: 9811 ms width: 40px height: 1089615 time: 29663 ms width: 50px height: 833745 time: 8120 ms width: 60px height: 585015 time: 4295 ms width: 70px height: 507420 time: 4216 ms width: 80px height: 402750 time: 7181 ms width: 90px height: 368070 time: 1998 ms width: 100px height: 313005 time: 1832 ms width: 110px height: 291480 time: 4508 ms width: 120px height: 272370 time: 1060 ms width: 130px height: 241770 time: 1390 ms width: 140px height: 229170 time: 1281 ms width: 150px height: 207240 time: 1292 ms width: 160px height: 197295 time: 1417 ms width: 170px height: 180750 time: 1622 ms width: 180px height: 173955 time: 1253 ms width: 190px height: 167130
Comment 10•13 years ago
|
||
Major hotspot (54.7% direct hits) is consistent with bz's profile (nsLineBox::IndexOf(nsIFrame*) const). 37.4% is in BuildTextRuns(), called via TrimTrailingWhiteSpace() (hmmm) - 20% of the 37.4% ends up in IndexOf() above; the rest comes through SetLength() per bz's results.
![]() |
||
Comment 11•13 years ago
|
||
> --enable-debug
It's really pretty pointless to do performance measurements in debug builds... For one thing, various part of layout have different algorithmic complexity in debug and non-debug. Maybe you'll get the same results as an opt build. But maybe you won't.
Comment 12•13 years ago
|
||
debug was what I had and I figured it would be a high signal; my opt build is ready now and is getting similar results - uniformly faster, but no real shift in the peaks. Output (with a more idle system than the last measurement) time: 3901 ms width: 0px height: 3118980 time: 2990 ms width: 10px height: 3118980 time: 2704 ms width: 20px height: 3118980 time: 87352 ms width: 30px height: 1597200 time: 8564 ms width: 40px height: 1089615 time: 22544 ms width: 50px height: 833745 time: 2312 ms width: 60px height: 585030 time: 3574 ms width: 70px height: 507420 time: 2845 ms width: 80px height: 402750 time: 1645 ms width: 90px height: 368070 time: 2070 ms width: 100px height: 313005 time: 1032 ms width: 110px height: 291480 time: 1793 ms width: 120px height: 272370 time: 1030 ms width: 130px height: 241770 time: 906 ms width: 140px height: 229170 time: 961 ms width: 150px height: 207240 time: 1169 ms width: 160px height: 197280 time: 1145 ms width: 170px height: 180750 time: 767 ms width: 180px height: 173955 time: 1011 ms width: 190px height: 167145
Comment 13•13 years ago
|
||
Jprof with --disable-debug (I've tweaked my objdir setup to reduce the cost in time (1hr+) of switching back and forth). Similar results, with a higher peak (64% vs 57%) for IndexOf() - but the number of direct hits is almost the same, and the ratios for coming in via SetLength vs nsBlockInFlowLineIterator() are basically the same. More time is being spent elsewhere in the debug version, but that didn't affect these routines noticably or the number of times these routines are called (or so it appears).
Attachment #538612 -
Attachment is obsolete: true
Updated•6 years ago
|
Summary: Infinite hang in line breaking code with large amount of text in a <pre> inside a narrow iframe → Infinite hang in line breaking code with large amount of text in a <pre> with "white-space: pre-wrap" inside a narrow iframe
Comment 14•6 years ago
|
||
FYI, the testcase (which depends on google maps API, etc) no longer works. The issue probably is still valid
Updated•1 year ago
|
Severity: normal → S3
You need to log in
before you can comment on or make changes to this bug.
Description
•