Vinnaren i pepparkakshustävlingen!
2020-08-10, 11:37
  #13
Medlem
28k8s avatar
Citat:
Ursprungligen postat av Trollfeeder
Om man från början vet att det kommer bli tight med någon viss resurs, visst. Men om man inte vet om det kommer vara cykler eller minne som kommer vara den trängsta resursen, så vet man inte vad man ska optimera. Loop unrolling är ett typexempel på det. Det ska man absolut inte ägna sig åt innan man vet om det är minne eller cykler man optimerar för. Kanske är det både och, och att man i så fall vill göra det i kritiska loopar men inte i andra. Kanske har man hur mycket cykler som helst, men får tight med minne. Då vill man inte ha det alls. Kanske har man oceaner av minne, men tight med cykler överallt. Först då kan det vara vettigt att göra det på varenda loop.

Jag håller med. Dagens kompilatorer är ofta ganska smarta och löser en hel del åt dig också. Min poäng är att inte glömma av att backa ibland och fundera ett varv till kring lösningen. Jag stöter ofta på juniora utvecklare som inte har en tanke på att skriva effektiv kod (eller ens förstår minneshantering (de flesta datavetenskapliga utbildningarna undervisar Java och .NET idag, där garbage collection istället får dra tunga lass)) utan förutsätter att målplattformen har oändliga resurser.
Citera
2020-08-10, 18:24
  #14
Medlem
Citat:
Ursprungligen postat av Trollfeeder
Det jag frågade var om du gör det åt dig själv, eller om det är kommersiellt.


eget program, målet är att det ska bli kommersiellt i framtiden





Citat:
Ok, ska jag tolka det som att dom opererar på olika data? Du delar inget data mellan funktionerna?

jo, en eller flera variabler från en funktions utdata används nästan alltid i nästa funktion



Citat:
Ja, men globala variabler är ju inte att rekommendera.



Det kan man väl om man vill ha magsår.

vad är det för fel på globala variabler?


jag har läst lite mer, jag hade missförstått en grej, trodde att man måste deklarera en pekare per variabel för att kunna ha multi-return men såg att man kan deklarera variabler helt vanligt och skicka in pekare med & före variabelnamnet. Så då går heapen bort för parametrarna för stacken fungerar. Det enda jag nu undrar om stack eller static är bättre? Parametrarna lever hela programmets livstid.

Använder ofta static i java, både variabler och funktioner, aldrig varit några problem.
Citera
2020-08-10, 18:26
  #15
Medlem
Citat:
Ursprungligen postat av Bromskloss
Jag är inte så säker på att någon heap bör vara inblandad alls i ett realtidssystem som det här, eller kanske i "inbyggda" system överhuvudtaget. Annars måste det ju finnas ett helt maskineri, med malloc och kanske operativsystem, för att tillhandahålla minnesallokeringsfunktionaliteten.

I stället går det väl bra att ha sakerna på stacken?:

https://onlinegdb.com/H1pfuzR-v
Kod:
#include <stdio.h>

void doubling(int*);

int main()
{
    int x = 5;
    printf("x: %d\n", x);

    doubling(&x);
    printf("x: %d\n", x);

    return 0;
}

void doubling(int *a)
{
    *a = 2*(*a);
}



Det är inte osannolikt att kompilatorn kommer generera samma kod i båda fallen så att det inte blir någon skillnad alls. Du kan testa sådant på sidan Compiler Explorer.

heap finns det ingen poäng med, det håller jag med om, hade missförstått en grej.

Det där med flera pekare, gör det stor skillnad eller snackar vi mikrosekunder?
Citera
2020-08-10, 18:30
  #16
Medlem
Citat:
Ursprungligen postat av 28k8
Håller delvis med. Att skriva eftertänkt (och i den här kontexten "optimerad") kod är något man alltid bör sträva efter. Visst kan man labba fram en lösning utan att tänka på datatyper, loop unrolling, pekararitmetik etc och ta städningen senare. Problemet är bara att det där "senare" sällan inträffar då kodbas och scope expanderar.

TS är definitivt ute på ovan beskrivna djupt vatten, men låt oss kasta ut en livboj som flyter och peka i rätt riktning.

Det är minnesgrejer jag tänker på när jag skriver "effektiv kod". Eftersom jag är ny inom C. En funktion som tar in en variabel kanske kopierar den, eller vad vet jag, såna grejer.
Vad är snabbast av static och stack-minnena?
Citera
2020-08-10, 18:59
  #17
Medlem
Citat:
Ursprungligen postat av chelchele
Ska skriva realtidskod för ett inbyggt system vilket jag aldrig gjort förut och tänkte se om nån kan hjälpa. Detta är strukturen på koden:

Kod:
parameter1
parameter2
parameter3
osv...

loop{

funktion1(flera invärden och utvärden)
funktion2(flera invärden och utvärden)
funktion3(flera invärden och utvärden)
osv...

}

Jag har läst att i C kan man få flera return-värden från en funktion genom att använda pekare. Så jag tänker göra så, behöver invärdena till funktionerna också vara pekare?

Spelar det nån roll om jag deklarerar parametrarna som vanligt:
Kod:
double d 10

eller om jag använder malloc? Kan nån förklara skillnaden?

I funktionerna tänker jag använda malloc/free för alla variabler som skapas i dem för att undvika fragmentering.

Vill ha så effektiv kod som möjligt.

Tack på förhand.

Eftersom du ställer den typ av frågor du gör så tror jag att det är en bra idé för dig att läsa på om skillnaden mellan stacken och heapen.
Citera
2020-08-10, 19:37
  #18
Medlem
Trollfeeders avatar
Citat:
Ursprungligen postat av chelchele
eget program, målet är att det ska bli kommersiellt i framtiden

Hur då? En ECU brukar väl vara rätt specifik hårdvara? Är det någon viss bil du riktar in dig på? Vad är det för hårdvara du leker med?

Citat:
jo, en eller flera variabler från en funktions utdata används nästan alltid i nästa funktion

Ok, då är det väldigt smidigt att ha en buffer ju jobbar i som du bara passar vidare pekaren till mellan anropen.

Citat:
vad är det för fel på globala variabler?

Det borde du redan veta om du har hållit på med python och Java. Dom är inte trådsäkra. Dom kan ändras från vart som helst i koden, så det är bug prone och kan vara drygt att debugga. Det leder till att saker blir mer kopplade än dom behöver vara. Osv, osv. Det har inte med C att göra. Globala variabler är allmänt dåligt och är något man undviker inom all programmering.

Citat:
jag har läst lite mer, jag hade missförstått en grej, trodde att man måste deklarera en pekare per variabel för att kunna ha multi-return men såg att man kan deklarera variabler helt vanligt och skicka in pekare med & före variabelnamnet. Så då går heapen bort för parametrarna för stacken fungerar. Det enda jag nu undrar om stack eller static är bättre? Parametrarna lever hela programmets livstid.

Static har nackdelen att dom lever under hela programmets livstid, så du kan inte använda det minnet till något annat. Har du ont om minne och använder mycket static så kan det bli ett problem. Dom är inte trådsäkra dessutom. Stackvariabler är standardvalet tills man har anledning att göra något annat.

Citat:
Använder ofta static i java, både variabler och funktioner, aldrig varit några problem.

Då antar jag att du mestadels skriver enkeltrådade applikationer i Java?

Notera att en funktion som är static är något helt annat i C än i Java, för övrigt.
Citera
2020-08-10, 19:41
  #19
Medlem
Bromsklosss avatar
Citat:
Ursprungligen postat av chelchele
Det där med flera pekare, gör det stor skillnad eller snackar vi mikrosekunder?

Ja, det rör sig troligt om mikrosekunder, men min poäng var att det till och med kan bli så att kompilatorn genererar exakt samma program i båda fallen. Kompilatorn använder genvägar där den kan så det blir inte nödvändigtvis en lång kedja av pekare bara för att man har skrivit C-koden så.
Citera
2020-08-10, 20:51
  #20
Medlem
28k8s avatar
Citat:
Ursprungligen postat av chelchele
Vad är snabbast av static och stack-minnena?

https://www.amazon.co.uk/dp/1839216581
https://www.amazon.co.uk/dp/1721530886
https://www.amazon.co.uk/dp/3319846728
https://www.amazon.co.uk/Curt-Schimm.../dp/B008WDQH04
https://www.amazon.com/Programming-E.../dp/1565923545
Citera
2020-08-10, 21:26
  #21
Medlem
.
Citera
2020-08-10, 21:27
  #22
Medlem
Citat:
Ursprungligen postat av Trollfeeder
Hur då? En ECU brukar väl vara rätt specifik hårdvara? Är det någon viss bil du riktar in dig på? Vad är det för hårdvara du leker med?


tänk simulink, men direkt till kod, programmet är:
block diagram -> kod -> uträkning/simulering
det fungerar redan, men koden är m-kod och går inte snabbare än 100 hz i realtid med acceptabelt jitter på PC, med octave (gratis matlab) som subprocess. Vill lägga till C-kod-generering och körning vilket kommer ge många fler tillämpningar och kanske möjlighet att kommersialisera.
Såna här program är svindyra, dSpace/targetlink 100k, simulink/coder ca: 100k.
Mitt prog är mkt enklare, genererar kod direkt från blockdiagrammen, man slipper extrastegen att göra om simuleringen till "hw-in the loop" och sen produktionskod, man jobbar alltid med produktionskoden.


Citat:
Ok, då är det väldigt smidigt att ha en buffer ju jobbar i som du bara passar vidare pekaren till mellan anropen.

kan du förklara detta? förstår inte.

Citat:
Det borde du redan veta om du har hållit på med python och Java. Dom är inte trådsäkra. Dom kan ändras från vart som helst i koden, så det är bug prone och kan vara drygt att debugga. Det leder till att saker blir mer kopplade än dom behöver vara. Osv, osv. Det har inte med C att göra. Globala variabler är allmänt dåligt och är något man undviker inom all programmering.



Static har nackdelen att dom lever under hela programmets livstid, så du kan inte använda det minnet till något annat. Har du ont om minne och använder mycket static så kan det bli ett problem. Dom är inte trådsäkra dessutom. Stackvariabler är standardvalet tills man har anledning att göra något annat.

ok, ok, det är som med java. Jag läste att static är lite snabbare än stack, så jag får se hur jag gör, det är enkelt att ändra dock. Kodstrukturen är enkel och att lägga variabler i static är inget att oroa sig för.
Parametrarna lever under hela programmets livstid.
Varför kan static bli problem om jag har ont om minne? du menar att de inte deallokeras?

Citat:
Då antar jag att du mestadels skriver enkeltrådade applikationer i Java?

Är faktiskt självsäker på mina kodningskills
Brukar göra GUI:t i main och ha variabler som behövs i många klasser som static och funktioner som är "centrala" som static. Men visst undviker jag static annars. Trådar i separata klasser som är kopplat till vad de nu sysslar med.

Citat:
Notera att en funktion som är static är något helt annat i C än i Java, för övrigt.

hur skiljer det sig?
__________________
Senast redigerad av chelchele 2020-08-10 kl. 21:34.
Citera
2020-08-10, 21:32
  #23
Medlem
Citat:
Ursprungligen postat av 28k8
https://www.amazon.co.uk/dp/1839216581
https://www.amazon.co.uk/dp/1721530886
https://www.amazon.co.uk/dp/3319846728
https://www.amazon.co.uk/Curt-Schimm.../dp/B008WDQH04
https://www.amazon.com/Programming-E.../dp/1565923545

static jättelite snabbare enligt google.
Citera
2020-08-10, 22:43
  #24
Medlem
28k8s avatar
Citat:
Ursprungligen postat av chelchele
hur skiljer det sig?

Det handlar om translation units/scope i C.

statisk global variabel = file scope, du kan endast nå variabeln i aktuell fil (translation unit).
statisk funktion = file scope, du kan endast nå funktionen i denna fil (translation unit).
statisk lokal variabel = automatic local variable scope, värdet i variabeln behålls genom samtliga anrop till metoden variabeln finns i.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback