Closed
Bug 426585
Opened 17 years ago
Closed 17 years ago
Additional cache XPCPerThreadData for mainthread
Categories
(Core :: XPConnect, enhancement)
Tracking
()
RESOLVED
FIXED
mozilla1.9.1a1
People
(Reporter: gyuyoung.kim, Assigned: gyuyoung.kim)
Details
Attachments
(2 files, 3 obsolete files)
1.47 KB,
patch
|
dbradley
:
review+
brendan
:
superreview+
|
Details | Diff | Splinter Review |
1.47 KB,
patch
|
Details | Diff | Splinter Review |
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ko; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13
Build Identifier:
As mentioned in Bug 412698 comment 13, I made a new bug about it.
Reproducible: Always
Assignee | ||
Comment 1•17 years ago
|
||
Assignee | ||
Comment 2•17 years ago
|
||
I tested the patch in order to know how many we can get a performance gain from it.
I measured the execution time of GetData() until firefox displays the front page of three websites (youtube, espn, newyork times) all together from starting the firefox.
I tested 10 times with each cases.
The result is as below,
* Current source code:
- Average total called count of GetData() : 80,744 times
- Average total time of GetData() : 24,317 microsec.
- Used time per 1 calling : About 0.301152358 microsec.
* The patch is adjusted:
- Average total called count of GetData() : 78,128 times
- Average total time of GetData() : 23,415 microsec.
- Used time per 1 calling : About 0.299680646 microsec.
Of course, my test result can has an error. But, as mentioned in Mr. Stenback, there is not a big performance gain. On the contrary, a performance gain is too small.
It seems to me that my patch can get a little of performance gain when firefox is run during long time or with many tab browsing.
So, it seems that I can't insist the patch's approval.
Assignee | ||
Updated•17 years ago
|
Attachment #313148 -
Flags: superreview?(brendan)
Attachment #313148 -
Flags: review?(dbradley)
Updated•17 years ago
|
Status: UNCONFIRMED → NEW
Ever confirmed: true
Comment 3•17 years ago
|
||
Comment on attachment 313148 [details] [diff] [review]
Additional patch
>Index: xpcprivate.h
>===================================================================
>RCS file: /cvsroot/mozilla/js/src/xpconnect/src/xpcprivate.h,v
>retrieving revision 1.280
>diff -u -8 -p -r1.280 xpcprivate.h
>--- xpcprivate.h 29 Feb 2008 02:09:10 -0000 1.280
>+++ xpcprivate.h 1 Apr 2008 13:58:25 -0000
>@@ -3087,16 +3087,20 @@ public:
> {
> if(cx)
> {
> NS_ASSERTION(cx->thread, "Uh, JS context w/o a thread?");
>
> if(cx->thread == sMainJSThread)
> return sMainThreadData;
> }
>+ else{
Style nit: brace goe on next line, indented to underhang the first 'e' in 'else'.
>+ if(NS_IsMainThread() && sMainThreadData)
Another nit: other xpconnect code uses 'else if ' so you could avoid the braces around the else clause and reduce the indentation of the return here.
Non-nit: NS_IsMainThread() seems slower than PR_GetCurrentThread() == sMainThreadData->mThread.
>+ return sMainThreadData;
>+ }
See if you get a better win with the above non-nit, and please post updated performance results. Thanks,
/be
Assignee | ||
Comment 4•17 years ago
|
||
I tested the patch with PR_GetCurrentThread().
As a conclusion, the patch with Brendan's comment had the best result. But, the performance gain is small.
As I tested it before, I measured the execution time of GetData() until firefox displays the front page of three websites (ESPN, NewYork Times, CNN) simultaneously from starting the firefox.
And, I tested 10 times on each cases,
(I tried to profile them exactly, but the result can have a little error.)
Test results are as below,
- Current source
Average called count of GetData() : 88,685.2 times
Average execution time of GetData() : 26,672 microsec
Average time per 1 execution of GetData() : 0.301152358 microsec
- New patch with PR_GetCurrentThread()
Average called count of GetData() : 84,427.9 times
Average execution time of GetData() : 24,730.4 microsec
Average time per 1 execution of GetData() : 0.292934667 microsec
System Under Test
- CPU : Intel ® Core 2 Duo 6400 2.13 Ghz
- RAM : 2GB
- OS: Linux
- Kernel Info: 2.6.18-6-686
- Time measurement: I used the “struct timeval”
Attachment #313148 -
Attachment is obsolete: true
Attachment #313573 -
Flags: superreview?(brendan)
Attachment #313573 -
Flags: review?(dbradley)
Attachment #313148 -
Flags: superreview?(brendan)
Attachment #313148 -
Flags: review?(dbradley)
Assignee | ||
Updated•17 years ago
|
Attachment #313573 -
Flags: superreview?(brendan)
Attachment #313573 -
Flags: review?(dbradley)
Assignee | ||
Comment 5•17 years ago
|
||
The previous test has a big problem. The problem is that it seems mThread of XPCPerThreadData class doesn't be initialized. So, sMainThreadData->mThread == PR_GetCurrentThread() couldn't be a true. In other words, an additional caching couldn’t be adjusted in GetData(). It is my mistake.
I modified the GetDataImpl() in order to use the sMainThreadData->mThread, as below,
if(cx && !sMainJSThread && NS_IsMainThread())
{
sMainJSThread = cx->thread;
sMainThreadData = data;
+ sMainThreadData->mThread = PR_GetCurrentThread();
}
I tested them again with a modified source. The test scenario is same as I tested them before. The test results are as below,
- Current source
Average called count of GetData() : 84,037.9 times
Average execution time of GetData() : 24,563.5 usec
Average time per 1 execution of GetData() : 0.292247122 usec
Average called count of GetDataImpl() : 13,190.5 times
- New patch with PR_GetCurrentThread()
Average called count of GetData() : 84,455.7 times
Average execution time of GetData() : 23,480 microsec
Average time per 1 execution of GetData() : 0.278013925 microsec
. Average called count of GetDataImpl() : 337.8 times
Average called count of additional caching : 13,284 times
As a conclusion, the patch with PR_GetCurrentThread() has the best result.
System Under Test
- CPU : Intel ® Core 2 Duo 6400 2.13 Ghz
- RAM : 2GB
- OS: Linux
- Kernel Info: 2.6.18-6-686
- Time measurement: I used the “struct timeval”
BTW, it seems to me that a role of mThread in XPCPerThreadData class is to store the reference of thread which uses the XPCPerThreadData instance of mThread. If it is so, in my opinion, mThread variable need to be initialized in XPCPerThreadData() constructor as below.
XPCPerThreadData::XPCPerThreadData()
: …
+ mThread(nsnull),
…
{
if(gLock)
{
nsAutoLock lock(gLock);
mNextThread = gThreads;
gThreads = this;
}
+ mThread=PR_GetCurrentThread();
}
Attachment #313573 -
Attachment is obsolete: true
Assignee | ||
Updated•17 years ago
|
Attachment #314127 -
Attachment description: v2-patch with PR_GetThreadData → v2-patch with PR_GetCurrentThread()
Attachment #314127 -
Flags: superreview?(brendan)
Attachment #314127 -
Flags: review?(dbradley)
Assignee | ||
Updated•17 years ago
|
Attachment #314127 -
Flags: review?(dbradley)
Assignee | ||
Updated•17 years ago
|
Attachment #314127 -
Flags: review?(dbradley)
Comment 6•17 years ago
|
||
My crazy idea:
- note the start address of the stack for each thread as we create them
- sort them according to the platform's stack-growth direction
- look at an address of a local to see if we're in the main thread's range
A bit of book-keeping, but it would make "isMainThread" extremely cheap...
Assignee | ||
Comment 7•17 years ago
|
||
It seems to me we should modify the GetData() considerably in order to adjust an idea of Mr.Shaver, right?
And,if we can use isMainthread variable,I think it is better than using other skill s for performance.
Brendan, How do you think about it?
Comment 8•17 years ago
|
||
Still waiting on dbradley for r+, or a new patch per shaver's idea (which is clever and sounds like work ;-). I'm ok with making progress using the current patch if it passes David's review. The shaver-ific idea should go in a followup bug in that case.
/be
Assignee | ||
Comment 9•17 years ago
|
||
As Brendan said, I'd like to know Mr. bradley's thought about the patch as well.
Please give your comments or review to me.
Assignee | ||
Comment 10•17 years ago
|
||
It seems to me Mr.bradley is busy. If he is so,I'd like to change the reviewer. Please,let me know who can review the patch.
Comment 11•17 years ago
|
||
Comment on attachment 314127 [details] [diff] [review]
v2-patch with PR_GetCurrentThread()
r=dbradley
Nit, indent the else if to match the block.
What I found interesting is that before this patch, XPCPerThreadData::mThread doesn't appear to be used at all. Timeless moved it out of XPC_CHECK_WRAPPER_THREADSAFETY. But as far as I can tell wasn't used.
We can go Shaver's route later if someone gets ambitious and provides a patch, but I think this is fine for now.
Attachment #314127 -
Flags: review?(dbradley) → review+
Comment 12•17 years ago
|
||
Also I don't see comments on the bug unless I'm cc'd ;-)
Assignee | ||
Comment 13•17 years ago
|
||
When I made the patch with the mThread variable of XPCPerThreadData, I also couldn't find where the mThread was used as Mr. Bradley said above. I think this patch can be adjust temporally until go Shaver's route later.
Comment 14•17 years ago
|
||
Comment on attachment 314127 [details] [diff] [review]
v2-patch with PR_GetCurrentThread()
>+ else if(sMainThreadData && (sMainThreadData->mThread == PR_GetCurrentThread()))
>+ {
>+ return sMainThreadData;
>+ }
Indentation is off (by two few spaces) on the else and return lines that were added. Hope this is not due to hard tabs -- please expand all such, per the Emacs modeline at the top of the file.
/be
Assignee | ||
Comment 15•17 years ago
|
||
I modified my patch with Brendan and Mr.Bradley's advice. If the modified patch still has any nits, please let me know. Thank you.
Attachment #314127 -
Attachment is obsolete: true
Attachment #322033 -
Flags: superreview?(brendan)
Attachment #322033 -
Flags: review?(dbradley)
Attachment #314127 -
Flags: superreview?(brendan)
Comment 16•17 years ago
|
||
Comment on attachment 322033 [details] [diff] [review]
v3-patch with PR_GetCurrentThread()
r=dbradley
Looks fine.
For future reference you don't really need to repost for review for minor issues.
Attachment #322033 -
Flags: review?(dbradley) → review+
Comment 17•17 years ago
|
||
Comment on attachment 322033 [details] [diff] [review]
v3-patch with PR_GetCurrentThread()
>+ else if(sMainThreadData && (sMainThreadData->mThread == PR_GetCurrentThread()))
Final nit, no need to re-request reviews -- parenthesizing == against && is unnecessary and prevailing style in xpconnect does not so over-parenthesize. If you put up a patch to land without the parentheses around the == expression, just mark it r+ and sr+ and add the checkin-needed keyword to the bug. This can land in the appropriate post-1.9 repository. Thanks,
/be
Attachment #322033 -
Flags: superreview?(brendan) → superreview+
Assignee | ||
Comment 18•17 years ago
|
||
I attach new patch without the over-parenthesize.
Thanks.
Updated•17 years ago
|
Keywords: checkin-needed
Updated•17 years ago
|
Assignee: nobody → gyuyoung.kim
Assignee | ||
Updated•17 years ago
|
Status: NEW → ASSIGNED
Assignee | ||
Comment 19•17 years ago
|
||
I am waiting to merge this patch into mozilla trunk in order to change the status of bug with the FIXED.
Comment 20•17 years ago
|
||
Pushed in 15864:cb22a612ced5.
Status: ASSIGNED → RESOLVED
Closed: 17 years ago
Keywords: checkin-needed
Resolution: --- → FIXED
Target Milestone: --- → mozilla1.9.1a1
Version: unspecified → Trunk
You need to log in
before you can comment on or make changes to this bug.
Description
•