Avatar billede fartzzz Nybegynder
09. januar 2003 - 21:39 Der er 6 kommentarer og
1 løsning

Pointer understøttelse i c#

Hej,

Jeg vil lave et custom link list.. Den skal være så hurtig som overhovedet mulig,
da der skal masser af data i.
Jeg har lavet en simpel struktur:

        public  unsafe struct Node
        {

            public MyStruct* next;
            public int _data;               
               
            public int data
            {
                get {return  _data;}
                set { _data= value; }
            }
   
        }





Selve klassen:


    public unsafe class linkTest
    {
       
        public MyStruct* first;
       
       
        public linkTest()
        {
        first = null;
        }

        public void addItem()
        {
               
            node tempNode = new Node();

            Node* pNode = &tempNode;
            pNode->data  = 7;
            first = pNode;
           
        }

       

        public void displayItem()
        {
           
            Node tempNode = new Node();
            MyStruct* pNode = &tempNode;
            pNode = first;
                        // Nu skulle jeg så kunne data 
                        // med pNode->data? eller?
           
        }
    }


Jeg kunne godt tænke mig en "global" pointer, der pegede f.eks på første element. (senere vil jeg nemlig !så småt! lege med træer (btree :o))

Problemet er bare at hvis jeg gør det på denne her måde, er pointeren åbenbart ikke "pinnet". Hvis jeg kalder metoden: displayItem i addItem, bliver den pinnet. Er det muligt at have en a'la global pointer, der bliver sat ved instatiering?
Avatar billede fartzzz Nybegynder
09. januar 2003 - 21:54 #1
Lidt mere foklaring:
Jeg kunne godt tænke mig som i c++ hvor man definér i selve protypen pointeren til første element, så pointeren bliver "global"
Er det overhovedet nødvendigt at ha' en pointer da referencen er oprettet hos klienten/ giver det mere perfomance?
Avatar billede simon.ulsnes Nybegynder
09. januar 2003 - 22:15 #2
Det er ikke nødvendigt at bruger pointers i C# overhovedet. However, det er muligt at du vil kunne klemme en usandsynligt lille mændge ekstra performance ud af at bruge Managed C++ (hvor du selvfølgelig sagtens kan bruge pointers uden for unsafe blokke), men det er så lidt så det ikke kan betale sig medmindre du er meget mere fortrolig med C++ end med C#...

// Simon
Avatar billede fartzzz Nybegynder
09. januar 2003 - 22:30 #3
ok.. Det kan måske ikke lade sig gøre?

Jeg ville nemlig gerne presse det så meget som overhovedet muligt ned i perfomance.. og kun i c# ;o)
Avatar billede simon.ulsnes Nybegynder
09. januar 2003 - 22:38 #4
Så ville mit forslag være at du helt skal holde dig fra pointers. Jeg er ikke 100% sikker, men jeg tror at frameworket skal tænke sig om en ekstra gang for at bruge unmanaged kode, og derved opnår du faktisk en langsommere performance. Igen, du må ikke hænge mig op på det her...

Jeg er i hvert fald ikke endnu stødt på nogen som hævder at have klemt mere ud af C#/.NET Frameworket vha. pointers/unsafe kode. Jeg tror at der er taget højde for det ekstra du håber at opnå ved pointers i frameworket.

// Simon
Avatar billede simon.ulsnes Nybegynder
09. januar 2003 - 22:44 #5
Som du kan læse på http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csref/html/vcwlkunsafecodetutorial.asp, bør pointers (og unsafe kode generelt) i C# ikke anvendes medmindre det er strengt nødvendigt. Primært af sikkerhedsårsager.
Avatar billede fartzzz Nybegynder
09. januar 2003 - 23:54 #6
ok..
Jeg tror du har ret. Jeg vil prøve at holde mig fra pointers .. hvis det endelig går for langsom kan jeg jo prøve at lave det i et unmanaged dll, og så sammenligne..

Men uhh.. Jeg syntes ellers det var dejligt der var understøttelse for pointers, imod sammenligning med java ;o)

Men tak for hjælpen !
Avatar billede nielslbeck Nybegynder
09. januar 2003 - 23:56 #7
simon.ulsnes>> Ikke stødt på nogen, der hævder at ha' klemt mere ud af C#/.NET frameworket vha pointers? Hmm... Microsoft selv kan nu godt klemme mere ud, vha pointers (http://msdn.microsoft.com/library/en-us/dncscol/html/csharp10182001.asp?frame=true)... ganske vist er det her kun 14%, men så er den kode de er endt op med også omkring 140% grimmere end det de startede med ;-) Men vi tager lige et lille citat fra siden:


We did all of that for code that was 14 percent faster than our original safe code. Was it worth it?

The answer to that question depends on your application, but in general, the answer has to be "no, it isn't worth it." For the vast majority of applications, you'll get much better results if you write the simple code and then use your time to tune the algorithms. If you find a case where a 14 percent gain would be significant, that's the time to see if the unsafe option will make things faster.


Man kan dog være heldig at støde på et område, hvor det kan betale sig at benytte pointers. Microsoft har på en anden side (http://msdn.microsoft.com/library/en-us/dncscol/html/csharp11152001.asp?frame=true), vha pointers, opnået en kode som er 28 gange hurtigere end den oprindelige! Denne gang lykkedes det dem faktisk at gøre det uden, at koden blev totalt uforståelig - så det kan lade sig gøre, men normalt er det ikke umagen værd. Vi tager endnu et citat:


Sometimes unsafe code can be extremely useful, though gains of 28x are rare.
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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