Avatar billede plazm Nybegynder
11. december 2004 - 21:04 Der er 14 kommentarer og
1 løsning

Optimering af kode

Hey, jeg har lavet følgende kode, men som i sikkert kan se er jeg ikke særligt meget inde i C programering, så jeg ville være glad hvis nogen ville optimere koden lidt, da den bruger 2-4 % af cpu'en og jeg ville mene at dette må kunne gøres bedre. Det er sikkert main() det er galt med, da det er den del jeg selv har lavet :)

#include <windows.h>
#include <stdio.h>
HANDLE ATKACPIhandle;
#define MLED    0x44454c4d
#define WLED    0x44454c57
#define LED    0x44454c00
int CtrlACPI(int code, int hasArg, int arg)
{
    long bytes = 0;
    long inbuf[5];
    struct cmbuf {
        short cmds[2];
        long cm2;
    } cbuf;
    long outbuf[192];
    int ret;
   
    cbuf.cmds[0] = 0;
    cbuf.cmds[1] = 4;
    cbuf.cm2 = arg;
    inbuf[0] = 2;
    inbuf[1] = code;
    inbuf[2] = hasArg;
    inbuf[3] = 8 * hasArg;
    inbuf[4] = (long)&cbuf;

    ret = DeviceIoControl(ATKACPIhandle, 0x222404, inbuf, sizeof(inbuf),
        outbuf, sizeof(outbuf), &bytes, NULL);
    return ret;
}

int oldmain(int argc, char *argv[]) {
    int code = LED;
    int onoff;
    ATKACPIhandle = CreateFile("\\\\.\\ATKACPI",
        GENERIC_READ|GENERIC_WRITE,
        FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
        0, NULL);

    if (ATKACPIhandle) {
        code |= argv[1][0];
        onoff = argv[2][0] & 1;
        CtrlACPI(code, 1, onoff);
    }
}
int main(int a) {
    if (!a) {
      int a = 1;     
    }
    while (a != 0) {
      if (a == 1) {
        char *args[3] = { "leds.exe", "M", "1" };
        oldmain(3,args);
        char *aargs[3] = { "leds.exe", "W", "1" };
        oldmain(3,aargs);
        sleep(100);
        main(2);
      }
      else if (a == 2) {
        char *args[3] = { "leds.exe", "M", "0" };
        oldmain(3,args);
        char *aargs[3] = { "leds.exe", "W", "0" };
        oldmain(3,aargs);
        sleep(100);
        main(1);
      }
    }
}
Avatar billede arne_v Ekspert
11. december 2004 - 21:07 #1
Den main ser spøjs ud.
Avatar billede plazm Nybegynder
11. december 2004 - 21:09 #2
men den virker :) dog tror jeg ikk den er særlig optimeret ;)
Avatar billede arne_v Ekspert
11. december 2004 - 21:10 #3
void test(int i)
{
  char istr[15];
  sprintf(istr,"%d",i);
  char *args[3] = { "leds.exe", "M", istr };
  oldmain(3,args);
  char *aargs[3] = { "leds.exe", "W", istr };
  oldmain(3,aargs);
  sleep(100);
}

int main(int argc, char *argv[])
{
  test(1);
  test(0);
  return 0;
}
Avatar billede arne_v Ekspert
11. december 2004 - 21:11 #4
Eller er det meningen at main skal gå i uendelig løkke ?
Avatar billede arne_v Ekspert
11. december 2004 - 21:12 #5
Der er ikke noget kode som umiddelbart ser vildt ineffektivt ud.
Avatar billede plazm Nybegynder
11. december 2004 - 21:12 #6
det er helt bevist, da den skifter state af to leds
og det skal den blive ved med indtil programmet lukker
Avatar billede arne_v Ekspert
11. december 2004 - 21:16 #7
jeg ville nok lave det som noget lignende:

int main(int argc, char *argv[])
{
  int i = 0;
  while(true)
  {
    test(i%2);
    i++;
  }
  return 0;
}
Avatar billede arne_v Ekspert
11. december 2004 - 21:17 #8
Spiser din applikation også memory ?

Fordi du laver vel egentlig en uendelig rekursion - og den må da koste
memory !
Avatar billede plazm Nybegynder
11. december 2004 - 21:19 #9
nope, det tager 688 kb.
Avatar billede plazm Nybegynder
11. december 2004 - 21:21 #10
men grunden kan vel være at det ATKACPIhandle programmet laver koster CPU ? Da den jo kontakter en Driver og bedre den sende info til motherboardet.
Avatar billede arne_v Ekspert
11. december 2004 - 21:25 #11
2-4% lyder af meget for det men jeg har ikke forstand på den slags (hardware interface)
Avatar billede plazm Nybegynder
11. december 2004 - 21:27 #12
har jeg heller ikke selv, men det er også bare gejl jeg sidder og er ved at lave, der sidder nemlig to leds på fronten af min asus bærbar som jeg kan kontrolere og er ved at lave et plugin til winamp så de skifter frem og tilbage når jeg hører musik, og så bruger jeg det som øvelse i programering af C/C++
Avatar billede plazm Nybegynder
17. december 2004 - 10:47 #13
får jeg et svar ? :)
Avatar billede arne_v Ekspert
17. december 2004 - 10:58 #14
det kan du da godt
Avatar billede plazm Nybegynder
17. december 2004 - 15:00 #15
takker =)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester