디지털 장인정신

블로그 이미지
WebKit개발자의 혼자쓰는 블로그
스페로

Article Category

All (71)
Technology (47)
Creativity (19)
Private (4)

Recent Comment

Recent Trackback

Calendar

«   2018/11   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  

Archive

My Link

  • Total337,541
  • Today9
  • Yesterday44
  1. 2012.12.12
    Profiling WebKit with Perf (1)
  2. 2012.12.11
    High-DPI and viewport and sub pixel layout (2)
  3. 2012.10.23
    WebKit css3 animations on Accelerated Compositing (1)
  4. 2012.10.20
    WebKit Filters Animation Internal (1)
  5. 2012.10.15
    WebKit2 Injected Bundle (1)
  6. 2012.06.02
    oprofile (2)
  7. 2012.05.31
    massif 메모리 사용량을 측정하자
  8. 2012.05.31
    cachegrind in valgrind (5)
  9. 2012.01.28
    WebKit2 Rendering 분석 (only if using Texture Mapper) (1)

it is like oprofile but a lot nicer

sudo perf top -p PID

https://perf.wiki.kernel.org/index.php/Main_Page



result

31.37%  libQt5Gui.so.5.0.0          [.] 0xa5a08                                                                                                                           

11.69%  libnvidia-glcore.so.304.43  [.] 0x13cb53f                                                                                                                         

 7.52%  perf-18917.map              [.] 0x7f2847734593                                                                                                                    

 6.01%  [kernel]                    [k] native_write_msr_safe                                                                                                             

 2.38%  libGL.so.304.43             [.] 0x7a85d                                                                                                                           

 1.00%  [kernel]                    [k] __schedule                                                                                                                        

 0.89%  [kernel]                    [k] set_next_entity                                                                                                                   

 0.85%  libJavaScriptCore.so.1.0.0  [.] _ZNK3JSC7JSValue3getEPNS_9ExecStateENS_12PropertyNameERNS_12PropertySlotE.constprop.219                                           

 0.84%  [kernel]                    [k] __ticket_spin_lock                                                                                                                

 0.80%  [kernel]                    [k] update_curr                                                                                                                       

 0.76%  libc-2.15.so                [.] __sched_yield                                                                                                                     

 0.70%  libWebCore.so.1.0.0         [.] WebCore::WebGLSharedObject::validate(WebCore::WebGLContextGroup const*, WebCore::WebGLRenderingContext const*) const              

 0.58%  libc-2.15.so                [.] __memmove_ssse3_back                                                                                                              

 0.51%  libnvidia-tls.so.304.43     [.] 0x1c70                                                                                                                            

 0.50%  libc-2.15.so                [.] _int_malloc                                                                                                                       

 0.46%  libJavaScriptCore.so.1.0.0  [.] operationGetById                                                                                                                  

 0.43%  libJavaScriptCore.so.1.0.0  [.] cti_op_stricteq                                                                                                                   

 0.42%  [kernel]                    [k] update_shares                                                                                                                     

 0.39%  libWTF.so.1.0.0             [.] WTF::Mutex::lock()                                                                                                                

 0.38%  libWebCore.so.1.0.0         [.] WebCore::GraphicsContext3D::makeContextCurrent()                                                                                  

 0.38%  libJavaScriptCore.so.1.0.0  [.] _ZNK3JSC7JSValue3getEPNS_9ExecStateENS_12PropertyNameERNS_12PropertySlotE.constprop.425                                           

 0.37%  [kernel]                    [k] update_stats_wait_end                                                                                                             

 0.37%  [kernel]                    [k] hrtick_update                                                                                                                     

 0.37%  libglib-2.0.so.0.3200.3     [.] poll@plt                                                                                                                          

 0.36%  libWebCore.so.1.0.0         [.] WebCore::JSWebGLRenderingContext::getOwnPropertySlot(JSC::JSCell*, JSC::ExecState*, JSC::PropertyName, JSC::PropertySlot&)        

 0.36%  [kernel]                    [k] pick_next_task_fair                                                                                                               

 0.35%  [kernel]                    [k] update_cfs_load                                                                                                                   

 0.35%  libpthread-2.15.so          [.] pthread_mutex_unlock                                                                                                              

 0.35%  libJavaScriptCore.so.1.0.0  [.] cti_op_jtrue                                                                                                                      

 0.33%  [kernel]                    [k] pick_next_entity                                                                                                                  

 0.31%  libc-2.15.so                [.] __libc_enable_asynccancel                                                                                                         

 0.31%  [kernel]                    [k] sock_alloc_send_pskb                                                                                                              

 0.31%  [kernel]                    [k] rb_insert_color                                                                                                                   

 0.30%  [kernel]                    [k] __rb_erase_color                                                                                                                  

 0.30%  [kernel]                    [k] system_call                                                                                                                       

 0.30%  [kernel]                    [k] kmem_cache_alloc_node                                                                                                             

 0.29%  [kernel]                    [k] put_prev_entity                                                                                                                   

 0.29%  [kernel]                    [k] get_vmalloc_info                                                                                                                  

 0.28%  [kernel]                    [k] _raw_spin_lock                                                                                                                    

 0.26%  [kernel]                    [k] native_read_tsc                                                                                                                   

 0.24%  libQt5Core.so.5.0.0         [.] QThreadStorageData::get() const                                                                                                   

 0.23%  libWebCore.so.1.0.0         [.] WebCore::WebGLRenderingContext::handleNPOTTextures(char const*, bool)                                                             

 0.22%  [kernel]                    [k] sys_sched_yield                                                                                                                   

 0.22%  libc-2.15.so                [.] __memset_sse2                                                                                                                     

 0.22%  [kernel]                    [k] __enqueue_entity                                                                                                                  

 0.21%  libWebCore.so.1.0.0         [.] WebCore::WebGLRenderingContext::vertexAttribPointer(unsigned int, int, unsigned int, unsigned char, int, long long, int&)         

 0.21%  libxcb.so.1.1.0             [.] 0xa790                                                                                                                            

 0.20%  [kernel]                    [k] nr_blockdev_pages                                                                                                                 

 0.20%  libWebCore.so.1.0.0         [.] WebCore::RenderLayer::paintLayerContents(WebCore::GraphicsContext*, WebCore::RenderLayer::LayerPaintingInfo const&, unsigned int) 

 0.20%  ld-2.15.so                  [.] __tls_get_addr                                                                                                                    

 0.20%  libc-2.15.so                [.] __strncmp_sse42                                                                                                                   

 0.19%  libWebCore.so.1.0.0         [.] WebCore::WebGLRenderingContext::sizeInBytes(unsigned int)                                                                         

 0.19%  libJavaScriptCore.so.1.0.0  [.] JSC::CodeBlock::updateAllPredictionsAndCountLiveness(JSC::OperationInProgress, unsigned int&, unsigned int&)                      

 0.18%  [kernel]                    [k] effective_load.isra.57                                                                                                            



'Technology > Webkit' 카테고리의 다른 글

Profiling WebKit with Perf  (1) 2012.12.12
High-DPI and viewport and sub pixel layout  (2) 2012.12.11
WebKit css3 animations on Accelerated Compositing  (1) 2012.10.23
WebKit Filters Animation Internal  (1) 2012.10.20
WebKit2 Injected Bundle  (1) 2012.10.15
oprofile  (2) 2012.06.02
Trackback 4 and Comment 1

에플 레티나 디스플레이 때문에 요즘 웹킷 그래픽스 folk들 사이에서는 HDPI지원을 위한 패치들이 한참이다.

관련된 주제들은 다음과 같다.


1. SubPixel layout

http://trac.webkit.org/wiki/LayoutUnit

http://trac.webkit.org/changeset/116009


2. SubPixel font rendering

https://docs.google.com/document/d/1wpzgGMqXgit6FBVaO76epnnFC_rQPdVKswrDQWyqO1M/edit#heading=h.bjsw53t8jqke


3. DEVICEPIXELRATIO & Viewport

http://www.html5rocks.com/en/tutorials/canvas/hidpi/

http://www.html5rocks.com/en/mobile/high-dpi/

http://www.quirksmode.org/blog/archives/2012/06/devicepixelrati.html

http://www.quirksmode.org/blog/archives/2012/07/more_about_devi.html

http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/UsingtheViewport/UsingtheViewport.html

http://developer.apple.com/library/safari/#documentation/NetworkingInternet/Conceptual/SafariImageDeliveryBestPractices/Introduction/Introduction.html

http://developer.android.com/guide/webapps/targeting.html


패치는 커녕 follow-up만으로도 힘이 붙인다.

'Technology > Webkit' 카테고리의 다른 글

Profiling WebKit with Perf  (1) 2012.12.12
High-DPI and viewport and sub pixel layout  (2) 2012.12.11
WebKit css3 animations on Accelerated Compositing  (1) 2012.10.23
WebKit Filters Animation Internal  (1) 2012.10.20
WebKit2 Injected Bundle  (1) 2012.10.15
oprofile  (2) 2012.06.02
Trackback 0 and Comment 2

우선 WebCore의 animation의 구조부터 보자


1. AnimationController

- timer로 animation loop를 돌린다.

- Map<renderer, CompositeAnimation>으로 document의 모든 animation을 관리한다.


2. CompositeAnimation

- Map<name, KeyframeAnimation> 혹은 Map<int, ImplicitAnimation>으로 animation들을 관리한다. 하나의 renderer가 여러 keyframe&transition animation의 적용을 받을수 있기 때문이다.


3. AnimationBase

- RefPtr<Animation> : name, TimingFunction, delay, duration, iterCount 등을 관리


4. KeyframeAnimation extends AnimationBase

-  KeyframeList : keyframe당 style들을 저장. animation하는 CSSPropertyID들도 저장

- RenderStyle : animation되기 전의 style. animation시 keyframe당 style을 이 객체로 부터 복사해서 만든다.

Software path에서는 KeyframeAnimation::animate 메소드로 animation을 blend한다. 그럼 무려 RenderStyle로 blend를 하는 비효율을 보여준다.

AC path에서는 GraphicsLayer.h에 정의되어있는 KeyframeValueList 로 blend를 한다. 아주 효율적이다.

KeyframeValueList는 RenderLayerBacking::startAnimation에서 KeyframeList로부터 만들어낸다. 즉 각 platform GraphicsLayer는 RenderStyle과 관련없는 animation의 정수만 뽑아낸 KeyframeValueList를 받아 알아서 animation을 진행한다.

그럼 transition은 AC에서 어떻게 처리할까? RenderLayerBacking::startTransition이 transition을 keyframe animation처럼 KeyframeValueList 만들어서 GraphicsLayer에 넘겨준다.

즉 AC입장에서는 keyframe animation과 transition의 처리 루틴이 같다.

'Technology > Webkit' 카테고리의 다른 글

Profiling WebKit with Perf  (1) 2012.12.12
High-DPI and viewport and sub pixel layout  (2) 2012.12.11
WebKit css3 animations on Accelerated Compositing  (1) 2012.10.23
WebKit Filters Animation Internal  (1) 2012.10.20
WebKit2 Injected Bundle  (1) 2012.10.15
oprofile  (2) 2012.06.02
Trackback 0 and Comment 1

I investigated when enabling Accelerated Compositing. However, process is the same to software path until RenderLayer::styleChanged() in 3. Notify filters changed.


1. Animation loop : loop using timer in AnimationControllerPrivate

FrameView::serviceScriptedAnimations() <- request animation frame callback

AnimationController::serviceAnimations()

AnimationControllerPrivate::animationFrameCallbackFired()

AnimationControllerPrivate::animationTimerFired()

AnimationControllerPrivate::updateAnimationTimer()

1) m_animationTimer.startRepeating() if needed: creating loop

AnimationControllerPrivate::updateAnimations()

Document::updateStyleIfNeeded()

void RenderObject::setAnimatableStyle(PassRefPtr<RenderStyle> style)

{

    if (!isText() && style)

        setStyle(animation()->updateAnimations(this, style.get()));

    else

        setStyle(style);

}

1) Blend FilterOperation

2) Notify filters changed


2. Blend FilterOperation : Create FilterOperations per frame.

AnimationController::updateAnimations()

CompositeAnimation::animate()

KeyframeAnimation::animate()

CSSPropertyAnimation::blendProperties()

PropertyWrapperAcceleratedFilter::blend()

BasicColorMatrixFilterOperation::blend()


3. Notify filters changed : notify FilterOperations changed to RenderLayer

RenderObject::setStyle()

RenderLayerModelObject::styleDidChange()

RenderLayer::styleChanged()

4) ensure backing if needed

5) notify flush


4. ensure backing if needed : create RenderLayerBacking at the first time.

RenderLayerCompositor::updateLayerCompositingState()

RenderLayerCompositor::updateBacking()

RenderLayer::ensureBacking()


5. notify flush : notify FilterOperations changed to GraphicsLayer

RenderLayerBacking::updateGraphicsLayerGeometry()

RenderLayerBacking::updateFilters()

GraphicsLayerTextureMapper::setFilters()

LayerTreeCoordinator[AcceleratedCompositingContext]::scheduleLayerFlush()

'Technology > Webkit' 카테고리의 다른 글

High-DPI and viewport and sub pixel layout  (2) 2012.12.11
WebKit css3 animations on Accelerated Compositing  (1) 2012.10.23
WebKit Filters Animation Internal  (1) 2012.10.20
WebKit2 Injected Bundle  (1) 2012.10.15
oprofile  (2) 2012.06.02
massif 메모리 사용량을 측정하자  (0) 2012.05.31
Trackback 1 and Comment 1

Refer to

http://lists.webkit.org/pipermail/webkit-gtk/2012-May/001078.html


WebProcess의 addon을 달 수 있는 기능. 현재는 거의 WebKitTestRunner때문에 만들어졌다고 봐도 과언이 아니다. 
일반적인 plugin mechanism과 달리 오직 하나의 InjectedBundle만 WebProcess에 inject할 수 있다.

일반적인 plugin mechanism이란? (recommend to read  http://www.apibook.com/blog/)
API를 plugin을 통해 extending하는 방법. 크롬이 NPAPI API를 통해 author가 작성한 플러그인을 사용하거나 3D Max에서 서드파티가 제공하는 addon을 붙이는 방법이다. author는 plugin API를 구현한뒤 shared library로 만든다. 어플리케이션이 런타임에 shared library를 로드하고 해당 API를 콜하게 된다.
보통 plugin manager를 만들어 여러 shared library를 동시에 로드할 수 있게끔 구현한다. (크롬이 flash plugin과 pdf reader plugin을 동시에 쓸수 있는것 처럼)
근데 Injected Bundle은 오직 하나의 shared library만 로드할 수 있도록 심플하게 구현되어있다. (가장위의 refer 참조)

Call Flow
1. initialize
in Source/WebKit2/WebProcess/WebProcess.cpp

void WebProcess::postInjectedBundleMessage(const CoreIPC::DataReference& messageData)

{

    InjectedBundle* injectedBundle = WebProcess::shared().injectedBundle();

    ...

}


in Tools/WebKitTestRunner/InjectedBundle/InjectedBundleMain.cpp

void WKBundleInitialize(WKBundleRef bundle, WKTypeRef initializationUserData)

{

    WTR::InjectedBundle::shared().initialize(bundle, initializationUserData);

}


in Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.cpp

void InjectedBundle::initialize(WKBundleRef bundle, WKTypeRef initializationUserData)

{

    WKBundleClient client = {


    };

    WKBundleSetClient(m_bundle, &client);

}


in Source/WebKit2/WebProcess/InjectedBundle/InjectedBundle.cpp

void InjectedBundle::initializeClient(WKBundleClient* client)

{

    m_client.initialize(client);

}


2. create page

in Source/WebKit2/WebProcess/WebPage/WebPage/WebPage.cpp

PassRefPtr<WebPage> WebPage::create(uint64_t pageID, const WebPageCreationParameters& parameters)

{

    ....

    if (page->pageGroup()->isVisibleToInjectedBundle() && WebProcess::shared().injectedBundle())

        WebProcess::shared().injectedBundle()->didCreatePage(page.get());

    ....

}


in Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.cpp

void InjectedBundle::didCreatePage(WKBundlePageRef page)

{

    m_pages.append(adoptPtr(new InjectedBundlePage(page)));

}


in Tools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp

InjectedBundlePage::InjectedBundlePage(WKBundlePageRef page)

    : m_page(page)

    , m_world(AdoptWK, WKBundleScriptWorldCreateWorld())

{

    WKBundlePageLoaderClient loaderClient = {    };

    WKBundlePageSetPageLoaderClient(m_page, &loaderClient);


    WKBundlePageResourceLoadClient resourceLoadClient = {    };

    WKBundlePageSetResourceLoadClient(m_page, &resourceLoadClient);


    WKBundlePagePolicyClient policyClient = {    };

    WKBundlePageSetPolicyClient(m_page, &policyClient);


    WKBundlePageUIClient uiClient = {    };

    WKBundlePageSetUIClient(m_page, &uiClient);


    WKBundlePageEditorClient editorClient = {    };

    WKBundlePageSetEditorClient(m_page, &editorClient);


#if ENABLE(FULLSCREEN_API)

    WKBundlePageFullScreenClient fullScreenClient = {    };

    WKBundlePageSetFullScreenClient(m_page, &fullScreenClient);

#endif

}


in Source/WebKit2/WebProcess/WebPage/WebPage/WebPage.cpp

void WebPage::initializeInjectedBundleLoaderClient(WKBundlePageLoaderClient* client)

{

    ....

    m_loaderClient.initialize(client);

}


3. loader callback

in Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp

void WebFrameLoaderClient::postProgressFinishedNotification()

{

    if (WebPage* webPage = m_frame->page()) {

        if (m_frame->isMainFrame()) {

            // Notify the bundle client.

            webPage->injectedBundleLoaderClient().didFinishProgress(webPage);


            webPage->send(Messages::WebPageProxy::DidFinishProgress());

        }

    }

}


in Tools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp

void InjectedBundlePage::didFinishProgress(WKBundlePageRef, const void *clientInfo)

{

    static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didFinishProgress();

}



Build

InjectedBundle은 shared library로 따로 빌드된다. WebKitTestRunner를 실행히 env로 shared library의 path가 세팅된다.


in  Tools/WebKitTestRunner/GNUmakefile.am

# The InjectedBundle library allows the render process to load harness code.

if ENABLE_WEBKIT2

noinst_LTLIBRARIES += Libraries/libTestRunnerInjectedBundle.la

endif



How to send InjectedBundle path from UI Process to Web Process

위에서 서술하다 싶이 env로 UI Process의 TestController가 알아낸후 WebContext에게 알려준다.

in Tools/WebKitTestRunner/gtk/main.cpp

int main(int argc, char** argv)

{

    gtk_init(&argc, &argv);

    // Prefer the not installed web and plugin processes.

    WTR::TestController controller(argc, const_cast<const char**>(argv));

    return 0;

}


in Tools/WebKitTestRunner/TestController.cpp

void TestController::initialize(int argc, const char* argv[])

{

    ...

    initializeInjectedBundlePath();


    ...

    m_context.adopt(WKContextCreateWithInjectedBundlePath(injectedBundlePath()));

    ...

}


in Source/WebKit2/UIrocess/WebContext.cpp

PassRefPtr<WebContext> WebContext::create(const String& injectedBundlePath)

{

    JSC::initializeThreading();

    WTF::initializeMainThread();

    RunLoop::initializeMainRunLoop();

    return adoptRef(new WebContext(ProcessModelSharedSecondaryProcess, injectedBundlePath));

}


What is InjectedBundle in UI Process

UI Process에도 callback을 inject하는 듯한 코드들이 있다. (밑에처럼)

이것은 shared library를 ld하여 callback을 등록한다는 개념의 injected bundle보다는, 그냥 callback을 등록하는 코드이다.

코드를 reuse하기위해 콜백등록 패턴을 그냥 쓰는데, 코드를 읽는데 굉장한 혼란을 준다.


in Tools/WebKitTestRunner/TestController.cpp

void TestController::initialize(int argc, const char* argv[])

{

    ...

    WKContextInjectedBundleClient injectedBundleClient = {

        kWKContextInjectedBundleClientCurrentVersion,

        this,

        didReceiveMessageFromInjectedBundle,

        didReceiveSynchronousMessageFromInjectedBundle,

        0 // getInjectedBundleInitializationUserData

    };

    WKContextSetInjectedBundleClient(m_context.get(), &injectedBundleClient);

    ...

}


'Technology > Webkit' 카테고리의 다른 글

WebKit css3 animations on Accelerated Compositing  (1) 2012.10.23
WebKit Filters Animation Internal  (1) 2012.10.20
WebKit2 Injected Bundle  (1) 2012.10.15
oprofile  (2) 2012.06.02
massif 메모리 사용량을 측정하자  (0) 2012.05.31
cachegrind in valgrind  (5) 2012.05.31
Trackback 1 and Comment 1

how to use

http://lbrandy.com/blog/2008/11/oprofile-profiling-in-linux-for-fun-and-profit/


how to profile WebKit

http://trac.webkit.org/wiki/QtWebKitProfilingSetup


how to build vmlinux and attach to oprofile

http://lovebug356.blogspot.kr/2008/06/oprofile-setup-on-ubuntu.html


ubuntu 12.04 is not supported

https://launchpad.net/ubuntu/precise/amd64/oprofile/0.9.6-1.3ubuntu1


various profile wiki

http://wiki.gnashdev.org/Profiling

'Technology > Webkit' 카테고리의 다른 글

WebKit Filters Animation Internal  (1) 2012.10.20
WebKit2 Injected Bundle  (1) 2012.10.15
oprofile  (2) 2012.06.02
massif 메모리 사용량을 측정하자  (0) 2012.05.31
cachegrind in valgrind  (5) 2012.05.31
WebKit2 Rendering 분석 (only if using Texture Mapper)  (1) 2012.01.28
Trackback 0 and Comment 2

massif를 이용하면 메모리 사용량을 알 수 있습니다.

역시 valgrind tool중 하나 입니다.

luxtella@luxtella-T5500:bin(qt4.8.1)> valgrind --tool=massif ./QtTestBrowser

이렇게 실행하면 massif.out.8919 이런파일이 dump됩니다.

luxtella@luxtella-T5500:bin(qt4.8.1)> massif-visualizer ./massif.out.8919

이렇게 gui tool로 보면

1. 어느 모듈이 시간에 따라 얼마나 메모리를 사용했는지 알수 있고




2. 각 구간별로 그 메모리를 어떤 연유로 사용하게 됬는지 알 수 있습니다.
이게 편한 기능인데 WebKit안에서는 모두 fastMalloc으로 heap을 잡기 때문에 누가 heap을 잡았을까가 궁금한 부분이 잖아요.



'Technology > Webkit' 카테고리의 다른 글

WebKit Filters Animation Internal  (1) 2012.10.20
WebKit2 Injected Bundle  (1) 2012.10.15
oprofile  (2) 2012.06.02
massif 메모리 사용량을 측정하자  (0) 2012.05.31
cachegrind in valgrind  (5) 2012.05.31
WebKit2 Rendering 분석 (only if using Texture Mapper)  (1) 2012.01.28
Trackback 1 and Comment 0

valgrind tool중 cachegrind가 있습니다. 이걸로 WebKit정도로 큰 프로그램도 분석이 잘 됩니다.

단, VM위에서 돌아가는것이기 때문에 실제 하드웨어에서 일어난 것을 기록하는 것이 아닙니다.


luxtella@luxtella-T5500:bin(qt4.8.1)> valgrind --tool=cachegrind ./QtTestBrowser
==32017== Cachegrind, a cache and branch-prediction profiler
==32017== Copyright (C) 2002-2011, and GNU GPL'd, by Nicholas Nethercote et al.
==32017== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==32017== Command: ./QtTestBrowser
==32017== 
--32017-- warning: L3 cache found, using its data for the LL simulation.
--32017-- warning: pretending that LL cache has associativity 24 instead of actual 16
ASSERTION FAILED: !callLinkInfo->isLinked()
/media/WDDisk/workspace/WebKit/WebKit/Source/JavaScriptCore/jit/JIT.cpp(782) : static void JSC::JIT::linkFor(JSC::JSFunction*, JSC::CodeBlock*, JSC::CodeBlock*, JSC::AbstractMacroAssembler<JSC::X86Assembler>::CodePtr, JSC::CallLinkInfo*, JSC::JSGlobalData*, JSC::CodeSpecializationKind)
1   0x7f30c38 /media/WDDisk/workspace/WebKit/WebKit/WebKitBuild/qt4.8.1/Debug/lib/libQtWebKit.so.4(_ZN3JSC3JIT7linkForEPNS_10JSFunctionEPNS_9CodeBlockES4_NS_21MacroAssemblerCodePtrEPNS_12CallLinkInfoEPNS_12JSGlobalDataENS_22CodeSpecializationKindE+0x68) [0x7f30c38]
2   0x7f551d8 /media/WDDisk/workspace/WebKit/WebKit/WebKitBuild/qt4.8.1/Debug/lib/libQtWebKit.so.4(_ZN3JSC11lazyLinkForEPNS_9ExecStateENS_22CodeSpecializationKindE+0x20e) [0x7f551d8]
3   0x7f4b824 /media/WDDisk/workspace/WebKit/WebKit/WebKitBuild/qt4.8.1/Debug/lib/libQtWebKit.so.4(cti_vm_lazyLinkCall+0x45) [0x7f4b824]
4   0x7f46c7c /media/WDDisk/workspace/WebKit/WebKit/WebKitBuild/qt4.8.1/Debug/lib/libQtWebKit.so.4(+0x331fc7c) [0x7f46c7c]
5   0x7feffd190 [0x7feffd190]
==32017== 
==32017== Process terminating with default action of signal 11 (SIGSEGV)
==32017==  Access not within mapped region at address 0xBBADBEEF
==32017==    at 0x7F30C42: JSC::JIT::linkFor(JSC::JSFunction*, JSC::CodeBlock*, JSC::CodeBlock*, JSC::MacroAssemblerCodePtr, JSC::CallLinkInfo*, JSC::JSGlobalData*, JSC::CodeSpecializationKind) (JIT.cpp:782)
==32017==    by 0x7F551D7: JSC::lazyLinkFor(JSC::ExecState*, JSC::CodeSpecializationKind) (JITStubs.cpp:2250)
==32017==    by 0x7F4B823: cti_vm_lazyLinkCall (JITStubs.cpp:2260)
==32017==    by 0x7F46C7B: JSC::JITThunks::tryCacheGetByID(JSC::ExecState*, JSC::CodeBlock*, JSC::ReturnAddressPtr, JSC::JSValue, JSC::Identifier const&, JSC::PropertySlot const&, JSC::StructureStubInfo*) (JITStubs.cpp:970)
==32017==    by 0x7FEFFD18F: ???
==32017==    by 0x9CB7BFFF: ???
==32017==    by 0x9CA81727: ???
==32017==    by 0x9CB3F63F: ???
==32017==  If you believe this happened as a result of a stack
==32017==  overflow in your program's main thread (unlikely but
==32017==  possible), you can try to increase the size of the
==32017==  main thread stack using the --main-stacksize= flag.
==32017==  The main thread stack size used in this run was 8388608.
==32017== 
==32017== I   refs:      1,420,761,524
==32017== I1  misses:       13,760,687
==32017== LLi misses:          181,905
==32017== I1  miss rate:          0.96%
==32017== LLi miss rate:          0.01%
==32017== 
==32017== D   refs:        691,771,806  (436,040,846 rd   + 255,730,960 wr)
==32017== D1  misses:        7,138,046  (  5,395,096 rd   +   1,742,950 wr)
==32017== LLd misses:        1,162,214  (    585,093 rd   +     577,121 wr)
==32017== D1  miss rate:           1.0% (        1.2%     +         0.6%  )
==32017== LLd miss rate:           0.1% (        0.1%     +         0.2%  )
==32017== 
==32017== LL refs:          20,898,733  ( 19,155,783 rd   +   1,742,950 wr)
==32017== LL misses:         1,344,119  (    766,998 rd   +     577,121 wr)
==32017== LL miss rate:            0.0% (        0.0%     +         0.2%  )


cachegrind를 수행하면 더 자세한 정보를 기록한 cachegrind.out.26778 파일이 생성됩니다.

Instruction은 read만 있습니다. (당연히)
Ir = instruction cache reference count
I1mr = level1  instruction cache reference count
ILmr = last level  instruction cache reference count

Dr = data cache read
Dw = data cache write

적어도 Intel x86-64는 level1 cache가 last level cache에 inclusive하기 때문에 
ILmr이 I1mr을 포함합니다.


근데 WebKit만큼 큰 프로그램은 TLB miss도 성능에 큰 영향을 미칠텐데 TLB cache miss에 대한 simulation도 해주면 좋았을것 같습니다.

TLB entry가 보통 2^6 = 64 입니다.
WebKit binary가 20Mb 정도니깐 2^24 byte입니다.
page 하나가 4kb 이니깐 2^12 byte입니다.

즉 WebKit이 2^12 page entry가 필요하므로 TLB cache miss가 종종 나겠지요.


luxtella@luxtella-T5500:bin(qt4.8.1)> cg_annotate ./cachegrind.out.32017 
--------------------------------------------------------------------------------
I1 cache:         32768 B, 64 B, 4-way associative
D1 cache:         32768 B, 64 B, 8-way associative
LL cache:         12582912 B, 64 B, 24-way associative
Command:          ./QtTestBrowser
Data file:        ./cachegrind.out.32017
Events recorded:  Ir I1mr ILmr Dr D1mr DLmr Dw D1mw DLmw
Events shown:     Ir I1mr ILmr Dr D1mr DLmr Dw D1mw DLmw
Event sort order: Ir I1mr ILmr Dr D1mr DLmr Dw D1mw DLmw
Thresholds:       0.1 100 100 100 100 100 100 100 100
Include dirs:     
User annotated:   
Auto-annotation:  off

--------------------------------------------------------------------------------
           Ir       I1mr    ILmr          Dr      D1mr    DLmr          Dw      D1mw    DLmw 
--------------------------------------------------------------------------------
1,420,761,524 13,760,687 181,905 436,040,846 5,395,096 585,093 255,730,960 1,742,950 577,121  PROGRAM TOTALS

--------------------------------------------------------------------------------
        Ir    I1mr   ILmr         Dr      D1mr    DLmr         Dw    D1mw    DLmw  file:function
--------------------------------------------------------------------------------
99,305,497 643,416 14,169 26,645,393   227,697  18,945 12,672,674  81,293     820  ???:???
39,395,385     292     22 18,698,209       312       0  3,799,845      22       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp:WebCore::PNGImageDecoder::rowAvailable(unsigned char*, unsigned int, int)
32,236,006     661     21  7,518,357     5,497     370  3,390,527      18       0  /build/buildd/fontconfig-2.8.0/src/fcmatch.c:FcCompareValueList
29,100,597 233,020     85  4,532,352    69,642     131  4,167,771 107,962  49,964  /build/buildd/eglibc-2.15/malloc/malloc.c:_int_malloc
29,068,454   7,712     56  9,619,269 1,699,607  30,828  3,915,395   3,719     112  /build/buildd/eglibc-2.15/elf/dl-lookup.c:do_lookup_x
25,269,414      46      5  8,409,415       119       1  7,779,532  58,450       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/platform/image-decoders/ImageDecoder.h:WebCore::ImageFrame::setRGBA(unsigned int*, unsigned int, unsigned int, unsigned int, unsigned int)
24,217,492      21      2  9,314,420         7       0  8,382,978       1       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/platform/image-decoders/ImageDecoder.h:WebCore::ImageFrame::setRGBA(int, int, unsigned int, unsigned int, unsigned int, unsigned int)
24,191,093      22     22  5,247,245   377,503  95,022         95      10       0  /build/buildd/eglibc-2.15/elf/dl-addr.c:_dl_addr
23,840,201     217      8  4,724,137    18,004     413     42,455       0       0  /build/buildd/fontconfig-2.8.0/src/fcmatch.c:FcCompareFamily
21,423,166      22      1  7,451,536        47       0  5,588,652      76       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/platform/image-decoders/ImageDecoder.h:WebCore::ImageFrame::getAddr(int, int)
18,254,671     284     67  4,433,653    16,087       0  2,860,835   1,749     307  /build/buildd/zlib-1.2.3.4.dfsg/inffast.c:inflate_fast
12,440,125     595      2  4,080,881   186,432   5,903          0       0       0  /build/buildd/eglibc-2.15/string/../sysdeps/x86_64/multiarch/../strcmp.S:strcmp
12,349,939 145,145     30  3,455,299    23,569     498  1,558,632   2,406     213  /build/buildd/eglibc-2.15/malloc/malloc.c:_int_free
10,940,480     192      8  4,444,570    15,479       4  1,025,670       0       0  /build/buildd/libx11-1.4.99.1/build/src/../../src/ImUtil.c:_XGetPixel32
10,762,323  45,010      6  3,356,458     7,304       5  1,116,830   2,444      30  /build/buildd/eglibc-2.15/malloc/malloc.c:malloc
10,256,700     202      8  3,760,790         0       0  1,709,450  22,126   9,736  /build/buildd/libx11-1.4.99.1/build/src/../../src/ImUtil.c:_XPutPixel32
 9,886,381     259     21  3,060,251         0       0          0       0       0  /build/buildd/zlib-1.2.3.4.dfsg/adler32.c:adler32
 9,551,725   6,806     47  1,519,957    44,118  23,940    559,056   3,374     116  /build/buildd/eglibc-2.15/elf/dl-lookup.c:_dl_lookup_symbol_x
 9,549,331     935     25  2,203,495       240       4  3,378,699       0       0  /build/buildd/fontconfig-2.8.0/src/fccfg.c:FcConfigCompareValue
 9,314,530      23      2  2,794,359         2       0  2,794,359       1       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/platform/image-decoders/ImageDecoder.cpp:WebCore::ImageFrame::width() const
 8,228,387  26,079      9  2,134,977    10,838     259    352,449       0       0  /build/buildd/eglibc-2.15/nptl/pthread_mutex_lock.c:pthread_mutex_lock
 7,296,126     232      4  1,715,396     2,712     560    435,578       0       0  /build/buildd/fontconfig-2.8.0/src/fcstr.c:FcStrCaseWalkerNext
 6,621,370     322      1  3,783,640        46       0  1,891,820      14       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/platform/graphics/IntSize.h:WebCore::IntSize::width() const
 6,496,521  73,843    236  1,854,774   149,226  17,666  1,256,579 185,256  59,409  /build/buildd/eglibc-2.15/string/../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:__memcpy_ssse3_back
 6,125,331  35,798      3  1,758,605       361       0    352,811      23       0  /build/buildd/eglibc-2.15/nptl/pthread_mutex_unlock.c:pthread_mutex_unlock
 6,072,910  20,201     74  2,339,915     6,542     352    759,629     128       0  /media/WDDisk/workspace/WebKit/WebKit/WebKitBuild/qt4.8.1/Debug/Source/WebCore/generated/CSSGrammar.tab.c:cssyyparse(void*)
 6,056,030     573     41  1,881,023   195,246 185,888    847,866 171,460 148,763  /build/buildd/eglibc-2.15/elf/../sysdeps/x86_64/dl-machine.h:_dl_relocate_object
 5,854,840     137      4  1,170,968       113      14    305,042       0       0  /build/buildd/fontconfig-2.8.0/src/fcstr.c:FcStrCaseWalkerNextIgnoreBlanks
 5,577,397       6      0  3,187,084     3,941      10  1,593,542     319       1  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/platform/FractionalLayoutUnit.h:WebCore::FractionalLayoutUnit::rawValue() const
 5,329,790     217      4    862,065         3       0  1,411,620      62       0  /build/buildd/fontconfig-2.8.0/src/fcstr.c:FcStrCmpIgnoreCase
 5,227,238     599      4  1,305,612   174,240     116    748,324     730      14  /build/buildd/eglibc-2.15/elf/dl-misc.c:_dl_name_match_p
 5,221,656      76      8  1,100,160    29,808   1,743    199,824   2,885   2,856  /build/buildd/fontconfig-2.8.0/src/fcmatch.c:FcCompare
 5,130,671   3,264      0  1,578,668         0       0  1,973,335   4,395      16  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/platform/FractionalLayoutUnit.h:WebCore::FractionalLayoutUnit::FractionalLayoutUnit(WebCore::FractionalLayoutUnit const&)
 5,057,900  14,394      1  2,460,600         0       0  1,093,600     196       2  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/StringHasher.h:WTF::StringHasher::addCharactersToHash(unsigned short, unsigned short)
 4,970,592   8,911      2  1,367,156         0       0    932,594       5       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/PassRefPtr.h:void WTF::derefIfNotNull<WTF::StringImpl>(WTF::StringImpl*)
 4,953,676  76,762    109  1,404,573       206      11  1,056,124      41       0  /media/WDDisk/workspace/WebKit/WebKit/Source/JavaScriptCore/parser/Lexer.cpp:JSC::Lexer<unsigned short>::lex(JSC::JSTokenData*, JSC::JSTokenInfo*, unsigned int, bool)
 4,942,112  17,459     62    931,891    10,940     600          0       0       0  /build/buildd/eglibc-2.15/string/../sysdeps/x86_64/multiarch/strcmp-sse42.S:__strcmp_sse42
 4,871,658  52,255     49    190,798     9,917      11  2,308,276 265,583 177,382  /build/buildd/eglibc-2.15/string/../sysdeps/x86_64/multiarch/../memset.S:__GI_memset
 4,838,047  15,513      2  1,399,323     4,621      32          0       0       0  /build/buildd/eglibc-2.15/nptl/pthread_getspecific.c:pthread_getspecific
 4,643,562       1      1    672,980       226       5          0       0       0  ???:__popcountdi2
 4,482,198   3,970      0  2,561,256    27,697     551  1,280,628     214       1  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/RefPtr.h:WTF::RefPtr<WTF::StringImpl>::get() const
 4,411,792     430     10    664,000     1,131      26    155,172       0       0  /build/buildd/fontconfig-2.8.0/src/fcstr.c:FcStrCaseWalkerLong
 4,405,400     227      4    588,248         2       0    588,524       0       0  /build/buildd/fontconfig-2.8.0/src/fccfg.c:FcConfigPromote.isra.1
 4,274,873     168     12  1,367,824    20,670       0    513,027      10       0  /build/buildd/qt4-x11-4.8.1/src/gui/styles/qgtkpainter.cpp:QGtkPainter::renderTheme(unsigned char*, unsigned char*, QRect const&)
 4,252,859   1,899     46  1,277,644    14,008     700     31,779     441       0  /build/buildd/qt4-x11-4.8.1/src/gui/painting/qdrawhelper.cpp:qt_alphargbblit_quint32(QRasterBuffer*, int, int, unsigned int, unsigned int const*, int, int, int, QClipData const*)
 4,244,698     426     27  1,033,169   121,812 108,922     46,190      61       2  /build/buildd/eglibc-2.15/elf/do-rel.h:_dl_relocate_object
 4,179,860   7,684    154  1,227,482        13       0    358,590   9,605     597  /build/buildd/cairo-1.10.2/src/cairo-bentley-ottmann.c:_cairo_bentley_ottmann_tessellate_polygon
 4,138,460     194      7  1,042,760       240       2    684,780       0       0  /build/buildd/libx11-1.4.99.1/build/src/../../src/ImUtil.c:_XSetImage
 4,060,056  14,813      2  1,740,024         1       0  1,450,020     302       9  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/Locker.h:WTF::Locker<WTF::Mutex>::Locker(WTF::Mutex&)
 3,803,836   1,158     73  1,043,574   351,487     132    333,564   2,309      19  /build/buildd/eglibc-2.15/elf/dl-load.c:_dl_map_object
 3,798,528     348      8  1,026,470    22,042       0  1,367,860  22,756   4,302  /build/buildd/gtk+2.0-2.24.10/gdk/gdkpixbuf-drawable.c:rgb888alsb
 3,677,187  81,371    130  1,022,504     1,475       8    547,336     650       2  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/rendering/RenderBlockLineLayout.cpp:WebCore::RenderBlock::LineBreaker::nextLineBreak(WebCore::BidiResolver<WebCore::InlineIterator, WebCore::BidiRun>&, WebCore::LineInfo&, std::pair<WebCore::RenderText*, WebCore::LazyLineBreakIterator>&, WebCore::RenderBlock::FloatingObject*, unsigned int)
 3,674,897   2,608    192    709,344     3,171       8    490,927   1,106      85  /build/buildd/zlib-1.2.3.4.dfsg/inflate.c:inflate
 3,669,955     313      4  1,000,492    19,592   4,437     16,880       0       0  /build/buildd/fontconfig-2.8.0/src/fcpat.c:FcValueCanonicalize
 3,480,168  14,110      2  1,160,056         0       0  1,160,056   1,265      21  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/ThreadingPthreads.cpp:WTF::Mutex::lock()
 3,480,108  21,331      3  1,160,036         0       0  1,160,036       0       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/ThreadingPthreads.cpp:WTF::Mutex::unlock()
 3,439,935  28,848     57    932,996       492       3    505,000     209       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/platform/text/BidiResolver.h:WebCore::BidiResolver<WebCore::InlineIterator, WebCore::BidiRun>::createBidiRunsForLine(WebCore::InlineIterator const&, WebCore::VisualDirectionOverride, bool)
 3,296,540   4,155      0  1,318,616     1,033     122    988,962       5       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/RefPtr.h:WTF::RefPtr<WTF::StringImpl>::~RefPtr()
 3,257,037     706     10    594,033    45,750     743    115,645   1,672      74  /build/buildd/fontconfig-2.8.0/src/fcpat.c:FcStrStaticName
 3,220,326   2,698      2    894,535         0       0    894,535     500       2  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/platform/FractionalLayoutUnit.h:WebCore::FractionalLayoutUnit::isInBounds(int)
 3,182,924      53      6  1,207,316         0       0    658,536   1,676      47  /media/WDDisk/workspace/WebKit/WebKit/Source/JavaScriptCore/assembler/AssemblerBuffer.h:void JSC::AssemblerBuffer::putIntegralUnchecked<signed char>(signed char)
 3,182,778   7,697      0  1,414,568     2,185      86    707,284      54       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/RefPtr.h:WTF::RefPtr<WTF::StringImpl>::operator!() const
 3,131,723   8,077      5    776,379    26,884     304    336,732     438       1  /build/buildd/glib2.0-2.32.1/./glib/ghash.c:g_hash_table_lookup
 3,117,712     381     13     16,374        19       2     16,969   8,849     599  /build/buildd/qt4-x11-4.8.1/src/gui/painting/qdrawhelper_sse2.cpp:qt_memfill32_sse2(unsigned int*, unsigned int, int)
 3,097,248  28,741     15  1,220,128         5       0    375,424      61       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/StackBounds.h:WTF::StackBounds::checkConsistency() const
 3,056,230   8,569      1  1,222,492       858      12    611,246      63       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/rendering/RenderObject.h:WebCore::RenderObject::RenderObjectBitfields::isText() const
 3,056,230   4,492      0    916,869         0       0    916,869     105       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/rendering/RenderObject.h:WebCore::RenderObject::isText() const
 3,023,606   3,133      6    372,429     2,697     600          0       0       0  /build/buildd/glib2.0-2.32.1/./glib/ghash.c:g_str_hash
 2,943,170   6,430      2    735,690         0       0    919,305       7       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/text/WTFString.h:WTF::String::length() const
 2,900,000   6,202      1  1,160,000         5       0    870,000       0       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/Locker.h:WTF::Locker<WTF::Mutex>::~Locker()
 2,739,380      42     14    391,340     1,183       0    587,010     248     248  /build/buildd/qt4-x11-4.8.1/src/corelib/../3rdparty/harfbuzz/src/harfbuzz-gpos.c:Load_ValueRecord
 2,734,000  10,306      2    956,900         0       0    683,500     178       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/StringHasher.h:WTF::StringHasher::addCharacters(unsigned short, unsigned short)
 2,732,049   1,814     47    612,697    19,582     466    252,438      18       0  /build/buildd/fontconfig-2.8.0/src/fccfg.c:FcConfigSubstituteWithPat
 2,705,353      36      0  1,545,916         4       0    772,958       2       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/RefPtr.h:WTF::RefPtr<WTF::StringImpl>::operator->() const
 2,697,198   9,325      4    771,078         3       0    493,836      73       5  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/text/StringBuilder.h:WTF::StringBuilder::append(unsigned short)
 2,683,780     186      2    590,331     1,299      22          0       0       0  /build/buildd/qt4-x11-4.8.1/src/corelib/tools/qstring.cpp:ucstrncmp(QChar const*, QChar const*, int)
 2,623,185   2,712      2  1,412,462     2,186       0    504,458       0       0  /media/WDDisk/workspace/WebKit/WebKit/Source/JavaScriptCore/parser/Lexer.cpp:JSC::Lexer<unsigned short>::shift()
 2,604,520   1,614      2    685,400         0       0    822,480     215       5  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/RefPtr.h:bool WTF::operator==<WTF::StringImpl, WTF::StringImpl>(WTF::RefPtr<WTF::StringImpl> const&, WTF::RefPtr<WTF::StringImpl> const&)
 2,586,929      49      5    699,170         0       0    419,502       0       0  ???:FT_Get_Next_Char
 2,579,922  14,551      3    745,759        11       1    379,713     354       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/StringHasher.h:unsigned int WTF::StringHasher::computeHash<unsigned short, &(WTF::StringHasher::defaultConverter(unsigned short))>(unsigned short const*, unsigned int)
 2,519,912     296      6    440,957    24,037       0          0       0       0  /build/buildd/fontconfig-2.8.0/src/fcpat.c:FcHashOwnsName
 2,495,628   4,145      0    831,876         0       0    831,876     134       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/text/WTFString.h:WTF::String::impl() const
 2,491,452   8,795      2    692,070         0       0    415,242       0       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/rendering/RenderText.h:WebCore::toRenderText(WebCore::RenderObject*)
 2,487,780     226      6    314,734       819      24          0       0       0  /build/buildd/fontconfig-2.8.0/src/fclang.c:FcLangCompare
 2,453,782  36,924      6    521,586    11,932     321         12       0       0  /build/buildd/eglibc-2.15/malloc/malloc.c:free
 2,446,192   9,835      0  1,048,368       108       3          0       0       0  /build/buildd/eglibc-2.15/nptl/forward.c:pthread_mutex_unlock
 2,443,637  17,278      1  1,047,273       755       2          0       0       0  /build/buildd/eglibc-2.15/nptl/forward.c:pthread_mutex_lock
 2,432,329   8,338      3    827,603       682      16    413,916       0       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/rendering/InlineIterator.h:WebCore::InlineIterator::current() const
 2,397,168   5,360      1    799,056         0       0    799,056      76       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/text/AtomicString.h:WTF::AtomicString::impl() const
 2,346,390   1,410      3    938,556         0       0    312,852      29       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/StackBounds.h:WTF::StackBounds::isGrowingDownward() const
 2,344,017      16      8    705,969    10,641   2,372     11,852       0       0  /build/buildd/fontconfig-2.8.0/src/fccharset.c:FcCharSetIsSubset
 2,327,184      46      4    905,016     8,692   8,692    129,288       0       0  ???:FT_Stream_GetULong
 2,325,297     661      1  1,073,214         0       0    357,738     801     105  ???:WebCore::FractionalLayoutUnit::FractionalLayoutUnit(int)
 2,313,960  21,806      1  1,735,470     2,150      63          0       0       0  ???:WTF::OwnPtr<WTF::Mutex>::operator*() const
 2,309,499  10,096      2    684,296         1       0    769,833      69       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/platform/FractionalLayoutUnit.h:WebCore::operator+(WebCore::FractionalLayoutUnit const&, WebCore::FractionalLayoutUnit const&)
 2,289,882       0      0  1,144,941         7       0    490,689      33       1  /media/WDDisk/workspace/WebKit/WebKit/Source/JavaScriptCore/assembler/AssemblerBuffer.h:JSC::AssemblerBuffer::isAvailable(int)
 2,264,510     242      4          0         0       0    107,756       0       0  /build/buildd/qt4-x11-4.8.1/src/gui/../../include/QtGui/../../src/gui/painting/qrgb.h:qt_alphargbblit_quint32(QRasterBuffer*, int, int, unsigned int, unsigned int const*, int, int, int, QClipData const*)
 2,206,867   4,477      5    832,780         2       0    582,946      13       0  /media/WDDisk/workspace/WebKit/WebKit/Source/JavaScriptCore/parser/Parser.h:JSC::Parser<JSC::Lexer<unsigned short> >::next(unsigned int)
 2,195,470     196      6    212,275         0       0    543,360      13       0  /build/buildd/fontconfig-2.8.0/src/fcstr.c:FcStrCmpIgnoreBlanksAndCase
 2,176,918   6,719    146    401,277     7,314   1,718          0       0       0  /build/buildd/eglibc-2.15/string/../sysdeps/x86_64/multiarch/../strcmp.S:__GI_strcmp
 2,151,452      67     10    574,966        11       0    191,374      14       0  /build/buildd/qt4-x11-4.8.1/src/gui/painting/qdrawhelper.cpp:void blend_tiled_generic<(SpanMethod)0>(int, QT_FT_Span_ const*, void*)
 2,149,490   1,599      0    644,847         0       0    644,847     381       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/rendering/RenderObject.h:WebCore::RenderObject::style() const
 2,129,546  17,373     11    667,128     7,989      13    288,732     871      11  /build/buildd/qt4-x11-4.8.1/src/gui/text/qfontengine_ft.cpp:QFontEngineFT::stringToCMap(QChar const*, int, QGlyphLayout*, int*, QFlags<QTextEngine::ShaperFlag>) const
 2,118,450   4,132      6    508,428         0       0    423,690       4       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/Vector.h:WTF::Vector<JSC::Scope, 10ul>::at(unsigned long)
 2,112,657     376     11    415,925     1,002      72    152,263      38       0  /build/buildd/fontconfig-2.8.0/src/fclang.c:FcLangSetIndex
 2,075,696   6,936      0  1,186,112     9,422     570    593,056      30       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/text/StringImpl.h:WTF::StringImpl::length() const
 1,927,626   5,811      3    729,372         0       0    364,686       0       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/rendering/InlineIterator.h:WebCore::InlineIterator::fastIncrementInTextNode()
 1,916,882  24,430      3    697,048         0       0    697,048       0       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/StdLibExtras.h:operator new(unsigned long, NotNullTag, void*)
 1,909,353   4,838     14    922,321         1       0    350,569       0       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/platform/text/SegmentedString.h:WebCore::SegmentedString::advance(int&)
 1,906,224   2,433      6    466,798    14,078     126          0       0       0  /build/buildd/glib2.0-2.32.1/./gobject/gtype.c:g_type_check_instance_is_a
 1,901,300  13,994     14    533,794    51,056     501    339,628     538      15  /build/buildd/eglibc-2.15/malloc/malloc.c:malloc_consolidate.part.3
 1,898,537   4,980      1    499,615         0       0    599,538      58       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/text/AtomicString.h:WTF::operator==(WTF::AtomicString const&, WTF::AtomicString const&)
 1,888,026     900      3     72,798         0       0          0       0       0  ???:FT_MulFix
 1,880,236     695      6    822,601       183       1    470,060     134       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/ThreadSpecific.h:WTF::ThreadSpecific<WebCore::ThreadGlobalData>::get()
 1,880,231     692      3    940,113       184       4    470,059      71       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/platform/ThreadGlobalData.h:WebCore::threadGlobalData()
 1,868,196   3,801      2    339,672         0       0    509,508       0       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/HashTraits.h:bool WTF::HashTraitsEmptyValueChecker<WTF::HashTraits<WTF::RefPtr<WTF::StringImpl> >, false>::isEmptyValue<WTF::RefPtr<WTF::StringImpl> >(WTF::RefPtr<WTF::StringImpl> const&)
 1,859,212      62      2     12,300         0       0  1,834,612 454,415  61,383  /usr/lib/gcc/x86_64-linux-gnu/4.6/include/emmintrin.h:qt_memfill32_sse2(unsigned int*, unsigned int, int)
 1,848,252   1,877      3    218,354     1,852      83          0       0       0  /build/buildd/eglibc-2.15/string/../sysdeps/x86_64/multiarch/strchr.S:__strchr_sse42
 1,831,618     133      0    608,810         0       0    183,210       0       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/HashTable.h:WTF::HashTable<WTF::RefPtr<WTF::StringImpl>, WTF::RefPtr<WTF::StringImpl>, WTF::IdentityExtractor, JSC::IdentifierRepHash, WTF::HashTraits<WTF::RefPtr<WTF::StringImpl> >, WTF::HashTraits<WTF::RefPtr<WTF::StringImpl> > >::deallocateTable(WTF::RefPtr<WTF::S
 1,823,632     230      0    911,816       180       1    455,908     435       1  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/platform/Length.h:WebCore::Length::type() const
 1,821,782   3,641     14    671,239    42,209   8,874    232,198   4,551      82  /build/buildd/eglibc-2.15/elf/dl-lookup.c:check_match.11236
 1,720,305   8,701      3    669,363     1,738       8    381,853     385       8  /build/buildd/qt4-x11-4.8.1/src/corelib/thread/qmutex.cpp:QMutex::lock()
 1,707,679  34,653     12    359,460     3,614      11    168,452     298       1  /build/buildd/eglibc-2.15/malloc/malloc.c:realloc
 1,688,280       8      6    731,588         0       0    309,518   6,979   5,878  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/platform/text/TextCodecASCIIFastPath.h:WebCore::UCharByteFiller<8ul>::copy(unsigned short*, unsigned char const*)
 1,673,270   5,837      2    501,981         0       0    501,981       0       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/rendering/RenderText.h:WebCore::RenderText::textLength() const
 1,671,846  34,362     24    593,322         0       0    314,869      22       0  /media/WDDisk/workspace/WebKit/WebKit/Source/JavaScriptCore/parser/Lexer.cpp:JSC::JSTokenType JSC::Lexer<unsigned short>::parseIdentifier<true>(JSC::JSTokenData*, unsigned int, bool)
 1,658,244   1,798      2    631,712         0       0    473,784      65       0  /media/WDDisk/workspace/WebKit/WebKit/Source/JavaScriptCore/parser/Parser.h:JSC::Parser<JSC::Lexer<unsigned short> >::currentScope()
 1,640,430   2,023      3    447,390         5       0    397,680     180       5  ???:FT_Stream_EnterFrame
 1,603,224   3,239      3    572,580     2,132     809    458,064       1       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/RefPtr.h:WTF::RefPtr<WTF::StringImpl>::isHashTableDeletedValue() const
 1,598,464   7,205      3    456,704         0       0    513,792       2       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/platform/FractionalLayoutUnit.h:WebCore::operator-(WebCore::FractionalLayoutUnit const&, WebCore::FractionalLayoutUnit const&)
 1,591,386       3      3    243,664         1       0     41,578       0       0  /build/buildd/libx11-1.4.99.1/build/src/xlibi18n/../../../src/xlibi18n/lcFile.c:parse_line
 1,586,314  17,286    333    454,118     7,766     406    340,537  52,790   4,888  /build/buildd/eglibc-2.15/string/../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:__memmove_ssse3_back
 1,584,396       4      1    413,754    10,462       0          0       0       0  /build/buildd/fontconfig-2.8.0/src/fcmatch.c:FcSortCompare
 1,580,200     890      2    474,060         0       0    474,060      51       0  /media/WDDisk/workspace/WebKit/WebKit/Source/JavaScriptCore/runtime/JSCell.h:JSC::JSCell::unvalidatedStructure()
 1,572,672  10,873     20    206,368     5,058     683          0       0       0  /build/buildd/eglibc-2.15/string/../sysdeps/x86_64/multiarch/strlen-sse2-pminub.S:__strlen_sse2_pminub
 1,572,408     639      7    673,866     1,172       0    187,851       0       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/css/CSSParser.cpp:WebCore::CSSParser::parseURI(unsigned short*&, unsigned short*&)
 1,572,186   3,376      1    898,392     1,569       0    449,196     354       1  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/RefPtr.h:WTF::RefPtr<WebCore::RenderStyle>::get() const
 1,570,820     841      1    628,328     2,067      72    314,164      42       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/text/StringImpl.h:WTF::StringImpl::is8Bit() const
 1,554,839   2,092      0    706,745     1,842      25    424,047      59       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/dom/Node.h:WebCore::Node::getFlag(WebCore::Node::NodeFlags) const
 1,534,522   2,706      4    348,755         0       0    627,759      21       0  /media/WDDisk/workspace/WebKit/WebKit/Source/JavaScriptCore/parser/Parser.h:JSC::Parser<JSC::Lexer<unsigned short> >::strictMode()
 1,527,697     486      4    587,573         1       0    470,061     118       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/ThreadSpecific.h:WTF::ThreadSpecific<WebCore::ThreadGlobalData>::operator WebCore::ThreadGlobalData*()
 1,489,702   1,722     98    291,530    19,006     155     44,983   1,321      75  /build/buildd/eglibc-2.15/elf/dl-deps.c:_dl_map_object_deps
 1,489,506  24,466     18    684,832         0       0    278,398       0       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/HashTable.h:void WTF::removeIterator<WTF::RefPtr<WTF::StringImpl>, WTF::RefPtr<WTF::StringImpl>, WTF::IdentityExtractor, JSC::IdentifierRepHash, WTF::HashTraits<WTF::RefPtr<WTF::StringImpl> >, WTF::HashTraits<WTF::RefPtr<WTF::StringImpl> > >(WTF::HashTableConstIterat
 1,429,312     435      8    255,562       594      23    232,586      26       1  /build/buildd/glib2.0-2.32.1/./glib/gvarianttype.c:g_variant_type_string_scan
 1,427,298   3,020      8     73,905         0       0     49,270       0       0  ???:FT_MulDiv
 1,426,555      26      3    438,940         0       0    438,940      14       3  /media/WDDisk/workspace/WebKit/WebKit/Source/JavaScriptCore/assembler/AssemblerBuffer.h:JSC::AssemblerBuffer::putByteUnchecked(signed char)
 1,425,578  50,722    129    552,218       598      20    230,449      30       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WebCore/css/CSSParser.cpp:WebCore::CSSParser::lex(void*)
 1,422,494     238      4    182,253    10,456   1,621          0       0       0  /build/buildd/fontconfig-2.8.0/src/fcpat.c:FcPatternObjectFindElt
 1,421,316   8,953      2    355,328         0       0    444,157      73       0  /media/WDDisk/workspace/WebKit/WebKit/Source/WTF/wtf/text/WTFString.h:WTF::String::characters() const



'Technology > Webkit' 카테고리의 다른 글

WebKit Filters Animation Internal  (1) 2012.10.20
WebKit2 Injected Bundle  (1) 2012.10.15
oprofile  (2) 2012.06.02
massif 메모리 사용량을 측정하자  (0) 2012.05.31
cachegrind in valgrind  (5) 2012.05.31
WebKit2 Rendering 분석 (only if using Texture Mapper)  (1) 2012.01.28
Trackback 4 and Comment 5
WebKit2의 IPC중 가장 복잡한 부분이 Rendering이다. ShareableBitmap과 scene graph정보를 적절히 massage로 주고 받아야 하기 때문이다. 이번글에서, Qt의 Accelerated Compositing인 Texture Mapper가 어떻게 IPC를 통해 브라우저에 그림을 그리는지 살펴보겠다.

특별히 Qt의 TexMap을 분석하는 이유는 WebKit에 TextureMapper의 구현코드가 모두 있기 때문이다. (OpenGL를 써서 매우 아름답게 구현되어 있다.) Chrome과 Mac은 그들의 2D Vector Graphics Library (i.e. skia, core graphics)를 써서 Accelerated Compositing을 구현했기 때문에 분석이 쉽지 않다. 그 때문에 GTK와 EFL 포트역시 TexMap을 자신들의 AC(Accelerated Compositing)로 포팅을 하고 있다.

WebKit2에서 TexMap을 enable하려면 무조건 TBS를 enable해야 한다.
TexMap을 disable하고 TBS만 enable할 수도 있다. 그러면 그림을 그리는 통신의 주체가 TiledDrawingArea가 된다. 이 글에서는 다루지 않는다.
TexMap을 enable하고 TBS를 disable할 수는 없다.
TexMap을 disable하고 TBS를 disable할 수 있다.  그러면 그림을 그리는 통신의 주체가 DrawingArea가 된다. 이 글에서는 다루지 않는다.
AC(TexMap뿐만 아니라)를 enable했을 때 그림을 그리는 통신의 주체는 LayerTreeHost이다.

이글은 TexMap과 TBS를 알고 있어야 읽을수 있다. 모르시는 분은 다음 링크부터 읽으세요.
TBS : http://ariya.ofilabs.com/2011/06/progressive-rendering-via-tiled-backing-store.html
TexMap :
http://www.sencha.com/blog/understanding-hardware-acceleration-on-mobile-browsers/
http://ariya.ofilabs.com/2011/07/fluid-animation-with-accelerated-composition.html
http://qtwebkit.blogspot.com/2010/10/texture-mapper-accelerated-compositing.html
WebKit2 : http://trac.webkit.org/wiki/WebKit2
Qt WebKit2 : http://ariya.ofilabs.com/2011/08/first-look-at-nokia-n950-web-browser.html

우선 Class Diagram부터 살펴보자
1. WebProcess
http://www.diagrammr.com/edit?key=dl7okJw6Skf
LayerTreeHostQt : UIProcess에 drawing message를 send & receive한다. WebLayerInfo struct에 ShareableBitmap과 Scene Graph 정보를 담아서 send한다.
 Receive Msg
      SetVisibleContentRectTrajectoryVectorID, : scroll
      SetVisibleContentRectAndScaleID, : scale
      RenderNextFrameID, : invalidate
      PurgeBackingStoresID, 
 Send Msg
      SyncCompositingLayerStateID, 
      SetRootCompositingLayerID,
      DeleteCompositingLayerID,
      CreateTileForLayerID, : TBS tile creation
      UpdateTileForLayerID,
      RemoveTileForLayerID,
      CreateDirectlyCompositedImageID, : Image elemene같은거는 TBS를 사용하지 않는다
      DestroyDirectlyCompositedImageID,
      DidRenderFrameID, 

Send Message의 struct
UpdateInfo : Tile 정보를 보낼때 사용
  tile의 size, scroll, updateRect 등의 정보
  ShareableBitmap::Handle

WebLayerInfo : GraphicsLayer의 정보를 보낼때 사용
  scene graph 정보
  ShareableBitmap::Handle : image element만 사용 (TBS 를 사용하지 않기 때문에)

WebGraphicsLayer
  1. LayerTreeHostQt가 AC를 시작하는 entry point가 되는 rootLayer : LayerTreeHostQt가 UI Process로 부터 받는 Msg를 수행하는 entry point
  2. 모든 RenderLayer의 GraphicsLayer : 모든 RenderLayer의 변화 사항을 UI Process로 보내는 곳 (m_client 이용)
  3. TBS의 tile의 client : Tile의 변화 사항을 UI Process로 보내는 곳 (m_layerTreeTileClient 이용)

2. UIProcess
http://www.diagrammr.com/edit?key=dkTm7Ld2Ndi
LayerTreeHostProxy :
 1. WebProcess의 LayerTreeHostQt와 IPC 통신을 한다. 어떤 Msg를 주고 받는지는 위에 기술한거의 반대이다.
 2. WebView로 부터 paintToCurrentGLContext call를 받았을때 m_rootLayer인 GraphicsLayerTextureMapper에게 AC를 시작 시킴

GraphicsLayerTextureMapper
 1. LayerTreeHostProxy가 AC를 시작하는 entry point가 되는 rootLayer : Web Process로 부터 받는 Msg를 수행하는 entry point
 2. LayerTreeHostProxy의 rootLayer를 head로 GraphicsLayer tree의 가 node들



시퀀스 다이어그램을 살펴보기전 TexMap구현의 몇가지 특이점을 집고 넘어가자.

GraphicsLayer의 구현체 : GraphicsLayerTextureMapper in UI Process,  WebGraphicsLayer in Web Process.

TexMap의 위치 : UI Process

WebProcess가 UI Process로 그림을 넘기는 방법
--- WebProcess
 1. WebProcess에서 WebGraphicsLayer들은 모두 TBS(Tiled Backing Store)를 갖는다. (TBS가 여러개란 의미이다.)
 2. SetNeedsDisplay 타이밍에 각각의 WebGraphicsLayer들이 자신의 TBS에 Contents를 update한다.
--- UIProcess
 3. UIProcess로 정보를 WebLayerInfo struct로 잘 packaging하여 메세지를 전송한다.
 4. 메세지를 잘 해석하여 GraphicsLayer의 PlatformLayer구현체인 TextureMapperNode를 업데이트한다.

UI Process에서 WebView가 그림을 그리는 방법
 1. LayerTreeHostProxyQt가 WebProcess로 부터 화면갱신에 관한 메세지를 받으면 m_messagesToRenderer에 메세지를 큐잉하고 webView에 updateViewport(이것이 invalidate)를 콜한다.
 2. 일정시간후 webView가 LayerTreeHostProxyQt에 paintToCurrentGLContext를 콜한다.
 3. m_messagesToRenderer에 쌓인 메세지를 모두 처리하고 TexMap을 이용하여 그림을 그린다.

WebGraphicsLayer의 생성 시점 (WebProcess) :
 1. 각 GraphicsLayer들이 만들어 질때.  (WebGraphicsLayer는 매우 여러개가 만들어진다.)
 2. LayerTreeHost가 만들어 질때. LayerTreeHost가 own하는 WebGraphicsLayer가 rootLayer이다.
GraphicsLayerTextureMapper의 생성 시점 (UIProcess) :
 1. root GraphicsLayer를 attach할 때.
 2. LayerTreeHostProxy가 만들어 질때.  LayerTreeHostProxy가 own하는 GraphicsLayerTextureMapper가 rootLayer이다.

SharableBitmap을 IPC하는 방법:
 1. SharableBitmap는 data (shared memory + image size) + method (GraphicsContext)이다.
 2. 질문의 답은 결국 shared memory를 IPC 어떻게 하는가이다.
     - win32경우 shared memory의 file handle과 pid를 같이 다른 process에 msg를 넘긴다.
     - 다른 process에서 handle이 만들어진 pid를 알면 같은 kernel object를 가르키는 file handle을 만들수 있다.


setNeedsDisplay부터 브라우저 화면에 그림이 그려지기 까지의 시퀀스 다이어그램

1. Invalidate
http://www.diagrammr.com/edit?key=dEJUawO7FFj
 1. RenderTree에서 자기가 소속된 RenderLayer에 setNeedsDisplay를 콜한다.
 2. 각 WebGraphicsLayer는 자신이 가진 TBS에 invalidate를 콜한다.
 3. TBS는 각 Tile에 updateBackBuffer를 콜한다.
 4. 각 Tile은 TileClient(WebGraphicsLayer)에 tiledBackingStorePaint를 콜한다.
 5. WebGraphicsLayer는 자신에게 소속된 RenderTree를 traversal하면서 Tile에 그림을 그린다.
 6. 각 Tile은 그림을 완성했으므로 UI Process에 그림과 세부정보를 UpdateInfo struct로 싸서 메세지를 보낸다.
 7. UI Process의 LayerTreeHostProxyQt는 m_messagesToRenderer에 메세지를 큐잉하고 webView에 updateViewport를 콜한다.

2. Update
http://www.diagrammr.com/edit?key=d0udlR9XYKS
 1. 여러가지 이유(i.e. UI Process의 여러 화면 바뀜 MSG들, RenderTree의 뭔가 바뀌었다는 notify들) 때문에 LayerTreeHostQt::scheduleLayerFlush()가 콜된다.
 2. LayerTreeHostQt는 자신이 가지고 있는 rootLayer와 nonCompositedContentLayer에 syncCompositingState를 콜한다.
 3. WebGraphicsLayer는 TBS를 업데이드 해야하면 업데이트하고 모든 pendingInfo를 LayerInfo로 만든후 UI Process에 메세지를 보낸다.
 4. UI Process의 LayerTreeHostProxyQt는 m_messagesToRenderer에 메세지를 큐잉하고 webView에 updateViewport를 콜한다.

3. Paint
http://www.diagrammr.com/edit?key=du1XRpcWn01
 1. WebView가 LayerTreeHostProxyQt에 paintToCurrentGLContext를 콜한다.
 2. m_messagesToRenderer에 쌓인 메세지를 처리하기 위해 GraphicsLayerTextureMapper::setSomething과 TextureMapperNode::syncCompositingState를 콜한다.
 3. 이렇게 TexMap Tree과 Web Process의 RenderLayer Tree가 sync되었다.
 4. LayerTreeHostProxyQt가 자신이 가진 rootNode(TextureMapperNode)에 paint를 콜한다.
 5. TexMap이 그림을 GLContext에 그린다.


'Technology > Webkit' 카테고리의 다른 글

WebKit Filters Animation Internal  (1) 2012.10.20
WebKit2 Injected Bundle  (1) 2012.10.15
oprofile  (2) 2012.06.02
massif 메모리 사용량을 측정하자  (0) 2012.05.31
cachegrind in valgrind  (5) 2012.05.31
WebKit2 Rendering 분석 (only if using Texture Mapper)  (1) 2012.01.28
Trackback 3 and Comment 1