PR_Open/PR_Close efficiency need improvement

NEW
Assigned to

Status

16 years ago
12 years ago

People

(Reporter: kirk.erickson, Assigned: wtc)

Tracking

4.1.2
x86
Linux

Firefox Tracking Flags

(Not tracked)

Details

(Reporter)

Description

16 years ago
Sun BugTraq Bug Id:  4826694.
Filed by pallab.bhattacharya@sun.com.
	
Hardware version: ultra
O/S version (unbundled products): generic

 Comments:
Tested with NSPR 4.1.2 -- Cannot Put that version in Customer-Call-Info

Microbenchmarks show the perf of NSPR-Open/Close is about 16 to 30% higher
than libc/pthread version of the same function -- 

Open Time (micro-sec), Open call followed by a Close before next Open call
NSPR    PTHREAD/LIBC
------- ------------
   9760    5200
   6080    4720
   5760    4400
   5520    4480
   5440    4560
------- -------
   6512    4672
------- -------

Open Time (micro-sec) Open call followed by another Open call (close never called)
NSPR    PTHREAD
------- -------
  11920    6800
   9360    6000
   8000    5680
   9760    6080
   8080    5600
------- -------
   9424    6032
------- -------


Close Time(micro-sec)
NSPR    PTHREAD/LIBC
------- ------------
   4400    3120
   3280    2720
   3200    2720
   3120    2720
   3200    2720
------- -------
   3440    2800
------- -------

Comment 1

16 years ago
pallab.bhattacharya@sun.com 2003-03-11
Addl. Info  to root-cause the perf. issue
		
Series of if/case before/after the sys-call and a generic pt_SetMethods
  			
_PR_Getfd()/_PR_Putfd() causes serialization
  			
The conversion from PR_<OPEN>_FLAGS to OS_<OPEN>_FLAGS -- with a series of if
blocks -- it could be avoided if the numerical values of PR_<OPEN>_FLAGS are
same  as the OS_<OPEN>_FLAGS
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  	  
     if (flags & PR_RDONLY) osflags |= O_RDONLY;
     if (flags & PR_WRONLY) osflags |= O_WRONLY;
     if (flags & PR_RDWR) osflags |= O_RDWR;
     if (flags & PR_APPEND) osflags |= O_APPEND;
     if (flags & PR_TRUNCATE) osflags |= O_TRUNC;
     if (flags & PR_EXCL) osflags |= O_EXCL;
     if (flags & PR_SYNC)
    {
#if defined(O_SYNC)
         osflags |= O_SYNC;
#elif defined(O_FSYNC)
         osflags |= O_FSYNC;
#else
#error "Neither O_SYNC nor O_FSYNC is defined on this platform"
#endif
    } 
    if (flags & PR_CREATE_FILE)
    {
        osflags |= O_CREAT;
        if (NULL !=_pr_rename_lock)
            PR_Lock(_pr_rename_lock);
    }
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
(Assignee)

Comment 2

16 years ago
Pallab:

Thank you for your analysis of the performance problems.

We can't change the numerical values of the PR_<OPEN> flags
because that will break binary compatibility.  Is there
another solution that does not require changing the numerical
values of the PR_<OPEN> flags?
QA Contact: wtchang → nspr
You need to log in before you can comment on or make changes to this bug.