Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Static och hastighet

Postades av 2005-04-28 20:59:41 - Rasmus Ågren, i forum c# (c-sharp), Tråden har 8 Kommentarer och lästs av 689 personer

Tjänar man något i prestande på att ha en metod som static om man har många objekt?


Svara

Sv: Static och hastighet

Postades av 2005-04-28 21:27:13 - Ola Lindfeldt

Absolut. Static (eller Shared i VB) innebär att koden i metoden finns kvar i minnet och behöver inte laddas upp i en ny minnesarea. Nytt minne behöver allokeras* när du skapar en ny instans av en klass och exekverar en metod i den klassen. Det är en stor prestandavinst att undvika det, eftersom det kostar mycket att allokera minne (programmet måste fråga operativet om lov, som kontrollerar om det är okej.. osv).


*) brasklapp för hur CLR internt hanterar dettta:
Eventuellt men sannolikt vid "många objekt" allokeras nytt minne.
Det kostar nog mindre än vad man inbillar sig men gratis är det knappast... :)


Svara

Sv:Static och hastighet

Postades av 2005-04-28 21:45:25 - Rasmus Ågren

Det var lite det jag misstänkte. Brukar ni ha många av era metoder som static? Egentligen kan man väl ha alla som static och skicka variabler som argument istället för att komma åt dem direkt. Är det en bra ide? Känns som om man förlorar lite av oo-känslan då.


Svara

Sv: Static och hastighet

Postades av 2005-04-28 23:22:46 - Oskar Johansson

Hm... Nu får vi inte feltolka Olas inlägg...

Jag tror Ola tolkade dig som att du ville ersätta static-metoder med vanliga metoder sin inte alls har något i en klass att göra.

T.ex.
Att du skulle göra om Show-metoden i System.Windows.Forms.MessageBox till non-static. Det skulle vara dumt då det inte finns något i klassen som är bundet till metoden.

Det där med minnet är bara aktuellt i det ögonblock du skapar ett objekt, inte när du anropar det.

Ditt objekt skapas ju bara en gång sedan använder du ju samma objekt, men det sliter inte på minnet.

Dessutom tror jag nästan att det går snabbare att köra utan static eftersom att det då inte blir så mycket kopierande av saker fram och tillbaka


Svara

Sv:Static och hastighet

Postades av 2005-04-28 23:48:59 - Rasmus Ågren

Men om mina objekt som jag skapar inte innehåller massa metoder (eftersom de är static) så blir de väl mindre? Borde det då inte gå snabbare?


Svara

Sv: Static och hastighet

Postades av 2005-04-29 00:02:44 - Göran Andersson

Metoder ligger aldrig i ett objekt. Det som ligger i objektet är bara objektets data (och möjligen referenser till virtuella metoder, jag vet inte hur det är implementerat i .NET).

Det spelar ingen, eller fruktansvärt liten, roll för prestanda ifall en metod är statisk eller inte. Den enda möjliga skillnaden är att en statiskt metod inte behöver en referens till objektet.

Med nästan absolut säkerhet finns det andra saker i din kod som du kan vinna oerhört mycket mer prestanda på att effektivisera.


Svara

Sv: Static och hastighet

Postades av 2005-04-29 08:09:29 - Ola Lindfeldt

<b>Det var lite det jag misstänkte. Brukar ni ha många av era metoder som static? </b>

De som är av typen utility functions.
Se t.ex. på Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteDataReader()
Det gör STOR skillnad i en ASP.NET applikation att många sådana slags metoder finns i minnet hela tiden (så länge ASP.NET-appplikationen lever!) i stället för att du skall skapa nya objekt varenda gång en användare stormar in på servern. Dessutom kan man utnyttja cachade SqlParams som lever kvar i minnet. (3000 användare samtidigt på din sajt, som skapar 40 Nya SqlParameters vid varje Request, alternativt inte gör det, vad är bäst tror du?... :-)

<b>Egentligen kan man väl ha alla som static och skicka variabler som argument istället för att komma åt dem direkt. Är det en bra ide? Känns som om man förlorar lite av oo-känslan då.</b>

Nej, det tycker jag inte är en bra idé (eftersom du förlorar oo-tänket).
Där du behöver objekt som har tillstånd ska det vara vanliga metoder. När det är Utils är de static. Typ.






Svara

Sv:Static och hastighet

Postades av 2005-04-29 08:12:14 - Martin Adrian

>Med nästan absolut säkerhet finns det andra saker i din kod som du kan vinna oerhört mycket mer prestanda på att effektivisera.

Håller helt med.

När man skriver kod skall man skriva så att den är enkel och överskådlig. Om resultatet inte blir tillräckligt snabbt får man försöka byta någon algoritm, ta bort någon onödig objektkopiering eller nåt.

Att en applikation skulle bli långsam beroende på static eller vilken datatyp man använder (integer/double/long) är inte troligt. Möjligtvis kan man titta på sånt inuti en liten loop som anropas många gånger.


Svara

Sv: Static och hastighet

Postades av 2005-04-29 09:21:38 - Andreas Håkansson

Rasmus,

<b>Men om mina objekt som jag skapar inte innehåller massa metoder (eftersom de är static) så blir de väl mindre? Borde det då inte gå snabbare?</b>

Nej detta är inte sant. Om du har en klass som innehåller en metod och sen skapar du 500 objekt av denna klassen, så kommer bara metoden att finnas en gång i minnet. Samtliga av dina objekt kommer peka till metoden i minnet. Så att ersätta instansmetoder med statiskametoder för att spara minne är inte ett hållbart argument.

Ett klass och dess innehåll fyller ett väldigt viktig OOP koncept och det är <b>inkapsling</b>. Ett objekt känner till sin <b>state</b> (status) och kan agera olika utifrån den aktuella status som den har. En med hjälp en instansmetod kan du man sedan skicka med ytterligare information för att berätta för objektet hur den skall agera.

Om du har en metod som <b>inte</b> är beroende av state, så <b>kan</b> den vara en lämplig kandidat för att bli en statiskmetod, men det är inte garanterat att den bör bli det. Det beror på vad metoden skall göra och i vilka sammanhang den skall konsumeras. Om du har ett objekt med en metod som heter Display så skulle man kunna gör

MyClass c = new MyClass();
c.Display();


och

MyClass c = new MyClass();
MyClass.Display(c);


Oftast är det första faller man vill använda. Men som sagt det är en design sak, som man får sätta sig ner och planera. Verkligen tänka över hur objektet och dess metoder kommer att användas. En annan sak är att om du ersätter instansmetoder med statiskametoder kommer du troligen att få skicka in betydligt fler parametrar för att ersätta den interna state som inte längre finns - det innebär också att du kommer få hålla reda på den informationen någon annanstanns, vilket troligen kommer leda till betydlig otypligare och oläsligare kod.

Ett bekymmer med instansmetoder är om du har ett litet objekt, med ett fåtal metoder, där du konstant måste skapa nya objekt och sedan anropa metoden, för att sen göra dig av med objekten igen. Vad du riskerar att göra då är att tvinga fram en <b>Garbage Collection</b> mycket tidigare än du skulle behöva, vilket kan leda till stundtals försämrad prestanda.. Men som det sagts tidigare i tråden så innehåller troligen din applikation andra saker som är betydligt tyngre att genomföra.



Svara

Nyligen

  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo
  • 14:25 Tips på verktyg för att skapa QR-k
  • 14:23 Tips på verktyg för att skapa QR-k
  • 20:52 Fungerer innskuddsbonuser egentlig

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 165
27 952
271 704
594
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies