The UNIX and Linux Forums  


Go Back   UNIX og Linux Forums > Top Forums > Højtstående Programmering
.
google unix.com



Højtstående Programmering Post spørgsmål om C, C + +, Java, SQL, og andre programmerings sprog her.

Mere UNIX og Linux Forum Emner du måske kan finde Helpful
Tråd Thread Starter Forum Svar Last Post
Semaforens raguramtgr UNIX for dummyer Spørgsmål & svar 7 06-15-2009 10:39 AM
Semaforens Jaken Shell Programmering og Scripting 2 04-04-2009 06:10 PM
dmidecode, RAM hastighed \u003d "Nuværende Hastighed: Ukendt" Santi Filsystemer, disketter og Hukommelse 0 02-16-2006 06:16 AM
Semaforens vjsony UNIX for dummyer Spørgsmål & svar 3 04-07-2003 03:06 PM
Semaforens yls177 UNIX for dummyer Spørgsmål & svar 1 10-09-2002 12:18 AM

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
LinkBack Thread Tools Søg denne tråd Karakter: Thread Rating: 1 votes, 4.00 average. Display Modes
  #1 (permalink)  
Old 10-01-2008
migurus migurus is offline
Registreret Bruger
  
 

Join Date: Sep 2008
Beliggenhed: USA
Stillinger: 49
følge op på otheus kode

Tak for den kode, når jeg kørte det, jeg fik i denne:
2.6.9/Xeon/3.2 MHz
(3 kører)
129.186,76 semop / s (8784700/68) [100]
129.367,65 semop / s (8797000/68) [100]
129.257,35 semop / s (8789500/68) [100]

SCO/Xeon/3.2 MHz
(3 kører)
527.641,18 semop / s (8969900/17) [100]
564.212,50 semop / s (9027400/16) [100]
535.800,00 semop / s (9108600/17) [100]

Jeg ser SCO er i stand til at gøre omkring 3 gange mere semop / s end Linux.

BTW, H / w er identisk med, jeg tror jeg har det indsendt i denne looong tråd.

Til Linux, vil jeg igen-post her s / w versioner:
Fedora 2.6.9
gcc - ver.3.4.3
ldd - ver. 2.3.5
glibc - ver 2.3.5
  #2 (permalink)  
Old 10-01-2008
migurus migurus is offline
Registreret Bruger
  
 

Join Date: Sep 2008
Beliggenhed: USA
Stillinger: 49
hjælpe mig med at forstå koden

Dette er en smule off-topic, men jeg er bange for, at jeg ikke helt forstår koden.

Min forståelse af formålet med den oprindelige loop
Citat:
Oprindeligt Indsendt af otheus View Post

Code:
    for (i = 0; i < 1000; ++i) {
        usleep(10);
        last=time(NULL);
        if (last > start) break;
    }
er til at starte hele måling på det punkt for forandring af den anden. Right?

Næste,
vi har to sløjfer: first run 8750000 gange, da de maxloop værdi 1000000,

Så vi kører loop op til 1250000 gange, hvor hver 100 iterationsprocedure vi kontrollerer for tiden, og hvis anden ændret, vi bryder ud
Citat:
Oprindeligt Indsendt af otheus View Post

Code:
    stop=time(NULL);
    for (i = maxloop - maxloop/8; i < maxloop; ++i) {
      if ( !(i % estimate) ) {
        last=time(NULL);
        if (last > stop) break;
        stop=last;
      }
 
      /* repeat semaphore opts */
      if ((sid = semget(key, NSEMS, IPC_CREAT | 0777)) == -1) {
          perror("Can Not Get Semaphore ID");
      }
      if (semctl(sid, NSEMS, GETALL, vals) == -1) {
          perror("Can Not Get Semaphore Values");
      }
    }
    stop=last;
Hvad er denne teknik for at kontrollere hver Nth iteration til? hvorfor ikke tjekke tidspunkt hver iteration? Er det, fordi dette vil tilføje, at mange ekstra tid opkald og mudret målingerne?

Deres præcisering vil blive værdsat.
  #3 (permalink)  
Old 10-01-2008
otheus's Avatar
otheus otheus is offline Forum Staff  
Redaktør ala Mode
  
 

Join Date: Feb 2007
Sted: Innsbruck, Østrig
Stillinger: 1891
Smile

Citat:
Oprindeligt Indsendt af migurus View Post
Dette er en smule off-topic, men jeg er bange for, at jeg ikke helt forstår koden.
Det er helt til emnet og en grund, jeg indsendt koden.

Citat:
er til at starte hele måling på det punkt for forandring af den anden. Right?
højre.

Citat:
Hvad er denne teknik for at kontrollere hver Nth iteration til? hvorfor ikke tjekke tidspunkt hver iteration? Er det, fordi dette vil tilføje, at mange ekstra tid opkald og mudret målingerne?
De besvarede det. AFAIK hver gang () kalder indebærer et system opkald. Jeg tror, der er en bedre måde at håndtere dette, men dette er den første, der kom til at tænke på.

Jeg værdsætter du kontrollere kode. At jeg er tilbøjelig til at slå fejl kan være en beskeden underdrivelse.
  #4 (permalink)  
Old 10-06-2008
otheus's Avatar
otheus otheus is offline Forum Staff  
Redaktør ala Mode
  
 

Join Date: Feb 2007
Sted: Innsbruck, Østrig
Stillinger: 1891
Jeg kontrolleret kerner. Der var større ændringer i 1995 (før version 2.0), 1998 (før version 2.4), og derefter igen med indførelsen af "O (1) Scheduler" (ikke sikker). Her er den kode - uændret siden 2.4 - det betyder semctl (GETALL):

Code:
        sma = sem_lock(semid);
/* check condition omitted */
        nsems = sma->sem_nsems;
        err=-EIDRM;
        if (sem_checkid(sma,semid)) goto out_unlock;
        err = -EACCES;
        if (ipcperms (&sma->sem_perm, (cmd==SETVAL||cmd==SETALL)?S_IWUGO:S_IRUGO))
                goto out_unlock;

	case GETALL:	{
		ushort __user *array = arg.array;
		int i;

		if(nsems > SEMMSL_FAST) {
/* omitted code -- relevant only when nsems > 256 */
		}

		for (i = 0; i < sma->sem_nsems; i++)
			sem_io[i] = sma->sem_base[i].semval;
		sem_unlock(sma);
		err = 0;
		if(copy_to_user(array, sem_io, nsems*sizeof(ushort)))
			err = -EFAULT;
		goto out_free;

Her er koden fra 2.0:

Code:
        case GETALL:
                if (ipcperms (ipcp, S_IRUGO)) return -EACCES;
                switch (cmd) {
/* ommitted irrelevant code */
                case GETALL:
                        array = arg.array;
                        i = verify_area (VERIFY_WRITE, array, nsems*sizeof(ushort));
                        if (i)
                                return i;
                }
                break;
/* skipping case statements */

        if (semary[id] == IPC_UNUSED || semary[id] == IPC_NOID)
                return -EIDRM;
/* the next line provides the sem_checkid() call from 2.4/2.6 code */
        if (sma->sem_perm.seq != (unsigned int) semid / SEMMNI)
                return -EIDRM;

        switch (cmd) {
        case GETALL:
                if (ipcperms (ipcp, S_IRUGO))
                        return -EACCES;
                for (i = 0; i < sma->sem_nsems; i++)
                        sem_io[i] = sma->sem_base[i].semval;
                memcpy_tofs (array, sem_io, nsems*sizeof(ushort));
                break;

Når du det kommer til stykket, den eneste forskel er i semlock () indkaldelse, der er behov for multi-CPU systemer. Det kunne være SCO er også på samme måde begrænset. Hvorfor har du ikke prøve en Linux 2.0 distribution, ligesom RedHat 5.2, der bruger Linux 2.0.36 (og bruger de samme sem kode som ovenfor). Installer den og benchmark den samme kode. Det ville være en stor hjælp for os alle, tror jeg.
  #5 (permalink)  
Old 10-06-2008
otheus's Avatar
otheus otheus is offline Forum Staff  
Redaktør ala Mode
  
 

Join Date: Feb 2007
Sted: Innsbruck, Østrig
Stillinger: 1891
Migurus,

Jeg e-mailede de vedligeholdere af koden. Dette er et svar, jeg fik tilbage fra Alan "Maddog" Cox (med tilladelse til at sende indlæg her):
Citat:
Citat:
Måske du kan bidrage til denne diskussion (om SCO vs linux ydeevne forskelle med semget):
Nr. men hvis du har en god test tilfælde bruger gettimeofday () i stedet for tid
så du får stor præcision tid datafil en fejl i bugzilla.kernel.org som jeg
forestille sig, Ingo Molnar og et par andre kunne være interesserede.

High performance Linux kode bruger futex slusers snarere end sys5 låse, men det
stadig ville være rart at vide, om der virkelig er sådan en stor forskel, og hvorfor

Alan
Så her er endnu en version bruger gettimeofday (). Må ikke gider at udgive en benchmarks her, medmindre de er væsentligt anderledes. Men forberede dem til bugzilla:

Code:
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <time.h>
#define NSEMS   2

const static long maxseconds = 1000;
main(int argc, char *argv[])
{
    struct timeval tod_start,tod_stop;
    long int start,stop;
    long int maxloop = 5000000;
    long int i;
    int sid;
    key_t key;
    ushort vals[NSEMS] = { 0, 0 };

    if (argc > 1)
      maxloop = atol(argv[1]);
    i = maxloop;

    key = ftok("/tmp",99);

    gettimeofday(&tod_start, NULL);
    while (--i) {
      if ((sid = semget(key, NSEMS, IPC_CREAT | 0777)) == -1) {
          perror("Can Not Get Semaphore ID");
      }
      if (semctl(sid, NSEMS, GETALL, vals) == -1) {
          perror("Can Not Get Semaphore Values");
      }
    }
    gettimeofday(&tod_stop,NULL);

    start = 1000*1000*(tod_start.tv_sec - maxseconds) + tod_start.tv_usec;
    stop  = 1000*1000*(tod_stop.tv_sec  - maxseconds) + tod_stop.tv_usec;

    printf("%.2f semop/s (%ld/%ld)\n",
      (double)maxloop/(stop-start)*1000*1000, maxloop, stop-start);
}

  #6 (permalink)  
Old 10-06-2008
migurus migurus is offline
Registreret Bruger
  
 

Join Date: Sep 2008
Beliggenhed: USA
Stillinger: 49
Otheus, jeg aldrig behandlet med rapportering om bugzilla, synes det TI mig Jeg er ikke helt berettiget, og jeg er bange for, at jeg vil sende noget ikke er relevant, så hvis du vil være enig i at gøre det selv, her er resultaterne fra 2. udgave af Deres' gettimeofday-baseret "kode, som jeg igen køre 4 gange så at få gennemsnit:

SCO
$ Tmx2
575.108,94 semop / s (5000000/8694005)
$ Tmx2
575.215,00 semop / s (5000000/8692402)
$ Tmx2
575.183,63 semop / s (5000000/8692876)
$ Tmx2
559.832,49 semop / s (5000000/8931243)

Linux:
$ ./tmx2
129.363,77 semop / s (5000000/38650699)
$ ./tmx2
129.428,22 semop / s (5000000/38631452)
$ ./tmx2
129.601,55 semop / s (5000000/38579786)
$ ./tmx2
129.511,76 semop / s (5000000/38606534)


Som du ser, ingen forskel fra det tidligere forsøg.

Bare for min præcisering: anden mennesker, der deltog i denne diskussion om unix.com formule samt om kerneltrap og andre steder var meget bekymret med 2 ting, at i mit perspektiv er irrelevant for emnet for denne tråd: tid målenøjagtighed og inddragelse af kører flere processer / tanke etc at ville mudret resultaterne. Jeg vil helt enig til, at hvis SCO vs Linux resultaterne var sammenlignelige. Men dette er ikke tilfældet her. SCO er tre gange hurtigere, uanset vi brugte min metode eller gettimeofday meget præcis metode. Med alle de generalomkostninger, der nogenlunde tilsvarende, ville jeg synes, vi var slags prygl omkring bush da vi forsøgte at nå have nøjagtighed i målingen (som ikke gør ondt, for cource!), Men det gjorde tråd oppustet.

Igen, tak til Otheus for dine forslag på dette punkt, jeg kernel code du lokalisere viser, at multi-CPU kapacitet tilføjer et lag af kompleksitet og hjælper det ikke den hastighed. Din og strcmp's (kerneltrap forum) recomendations at opgradere Linuxkernen er gennemtænkte.
migurus
  #7 (permalink)  
Old 10-06-2008
ramen_noodle ramen_noodle is offline Forum Advisor  
Registreret Bruger
  
 

Join Date: Dec 2007
Beliggenhed: Virginia, USA.
Posts: 251
Bare for kontrasten på en moderne Intel SMP-processor, der kører Linux 2.6.18 jeg få mere
end en million operationer / sek.
På denne baggrund tror jeg ikke, dette kan betragtes som en fejl .. mere af en voksende smerte.
Linux har altid været et projekt i frem bevægelse. Du enten indhente eller lider.
Linus er kort på undskyldninger for denne model, som jeg har set.

Code:
1402465.14 semop/s (5000000/3565151)
1409187.85 semop/s (5000000/3548143)
1448182.72 semop/s (5000000/3452603)

På en FreeBSD 6.0 maskine (Uniprocessor) tiden er interessant ...
Intel (R) Celeron (R) CPU 2.00GHz (1999,94-MHz 686-class CPU)

Code:
501281.02 semop/s (5000000/9974445)
500868.00 semop/s (5000000/9982670)
450727.95 semop/s (5000000/11093166)


Sidst redigeret af ramen_noodle; 10-08-2008 på 02:43 PM.. Årsag: tastefejl på kerne-version
Closed Thread

Bogmærker

Thread Tools Søg denne tråd
Søg denne tråd:

Avanceret søgning
Display Modes Bedøm denne tråd
Bedøm denne tråd:

Udstationering Regler
Du kan ikke post nye tråde
Du kan ikke post svar
Du kan ikke post vedhæftede filer
Du kan ikke redigere dine indlæg

BB-kode er
Smilies er
[IMG] koden er
HTML-koden er Slukket
Trackbacks er
Pingbacks er
Refbacks er




Alle tidspunkter er GMT -4. Den tid er nu 09:07 PM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Oversættelser Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
UNIX og Linux Forums Content Copyright © 1993-2009. Alle rettigheder Reserved.Ad Management ved RedTyger

Content Relevant webadresser ved vBSEO 3.2.0