Tuesday, 14 November 2017

C Gjennomsnittlig


Jeg har tatt en klasse i C og jeg har lært litt av det på egen hånd, og jeg tror jeg er i det punktet hvor jeg kunne lage noen få enkle programmer (mer enn bare noen få hundre linjer med kode som bokeksempler), men jeg dont Har noen gode ideer for hva du skal programmere. Jeg begynte å skrive kode for en tekstbasert RPG, men jeg vil prøve å kode noe mer som hvilke programmerere som programmerer for en levende kode. Alle som jobber i feltet har noen forslag I Lounge forumet er det noen ideer. Her er noen: hrm. Jeg kan foreslå en del lagt til for prosjektideer. En av de tingene jeg alltid har slitt med når jeg lærer et nytt språk, er å finne prosjekter som vil teste kunnskapen min uten å komme foran hva jeg har lest eller forstått. (hele tiden er det noe morsomt og underholdende å trene på. Noe som ga meg noen form for belønning, for eksempel å ha skrevet et program som jeg egentlig kunne bruke til.) En del hvor Prosjekter kunne sendes sammen med vanskeligheter eller noen måte å vite i hvilken rekkefølge det er best å gjøre dem, ville være en god idé. Jeg vet at dette er sannsynligvis ikke mye hjelp for deg icemanfan. Men det hjelper sannsynligvis folk som meg som nettopp startet C. Dette er min liste jeg laget. hehe. Jeg står fast på nummer 22. lolz. Kunne ikke få den dumme boblen slags klasse å jobbe for som 2 netter nå. sukker. Nybegynner 1. Skriv et program som finner faktoren av et nummer som er innført av brukeren. (se etter alle forhold) (Nybegynner). 2. Utvikle et program for å konvertere valuta X til valuta Y og visum versa (nybegynner). 3. Skriv et program som skriver ut følgende, brukeren skriver inn toppnummeret: 4. Skriv et program som skriver ut følgende, brukeren skriver inn bunnnummeret: 5. Skriv et program som skriver ut følgende trekant, brukeren vil legge inn bunnnummeret: 6. Utvikle et program som bruker et tilfeldig generert nummer for å velge 1 av 3 (eller flere) funksjoner for å vise brukeren. (Nybegynner) 7. Gissende spill. Skriv et c-spill som ber brukeren å gjette et nummer mellom 1 og 100. Hvis du gjettet riktig, vil det si at du vinner. Hvis du er for høy eller for lav, vil den også gi deg beskjed. (Nybegynner) 8. Lag et program som genererer Fibonacci-serien til et nummer n hvor n er oppgitt av brukeren. For eksempel. Hvis brukeren går inn i 10, vil utgangen være: 1 1 2 3 5 8 (Beginner) 9. Bestem hvor mange av tegnene vokaler og hvor mange er konsonanter i en gitt tekstlinje. Slutt også strengen når inngangskarakteren som er oppstått, er annet enn alfabeter. (Nybegynner). 10. Finn den femte roten av summen av rutene av de første 100 ODD-tallene bare. (Begynner) 11. Utfør 4-bokstavsordsammenligning, dvs. Oppgi alle mulige kombinasjoner av 4 bokstaver i et ord. Eks: Ordet TEST kan dekrypteres som TEST, TETS, TSET, TSTE, TTSE, TTES, etc. (Begynner) 12. Lag et program som lar brukeren legge inn radius, diameter eller område av sirkelen. Programmet skal da beregne de andre 2 basert på inngangen. (Nybegynner) 13. LES en tekstlinje og skriv den ut TILBAKEVENDER ved å bruke RECURSIVE-funksjonen. (Begynner) 14. Skriv et program for å SWAP innholdet i 3 variabler uten å bruke de midlertidige (eller ekstra) variablene. (Begynner) 15. Skriv et program som reverserer tallene i et heltall, som er 326 blir 623, etc. (Begynner) 16. Programmet vil fortelle brukeren hver gang om han gjettet høy eller lav. Brukeren vinner spillet når nummeret gjettet er det samme som tilfeldig generert nummer. (Begynner) 17. Skriv et program for å simulere en enkel kalkulator. Det bør akseptere to tall fra brukeren sammen med den nødvendige operasjonen som skal utføres. Tillegg, subtraksjon, divisjon og multiplikasjon er de grunnleggende operasjonene som skal implementeres. Du kan gjerne implementere de andre operasjonene (Begynner) 18. Bestem hvor mye penger er i en spargris som inneholder flere 50 paise mynter, 25 paise mynter, 20 paise mynter, 10 paise mynter og 5 paise mynter. Bruk følgende verdier for å teste programmet. Fem 50 paise mynter, tre 25 paise mynter, to 20 paise mynter, en 10 paise mynt og femten 5 paise mynter. (Nybegynner) 19. Opprett et enkelt Palindrom sjekkerprogram. Programmet skal tillate brukeren å skrive inn en streng og kontrollere om den oppgitte strengen er et palindrom eller ikke. Bare tall og alfabeter bør vurderes mens du ser etter palindromer - andre tegn skal ignoreres. (nybegynner) 20. Skriv et program som gir deg mulighet til å skrive inn studentpoeng og vekt. Programmet skal da beregne et veid gjennomsnitt og score basert på dataene som er innført av brukeren. (Begynner) Mellomliggende 21. Skriv et program som vil skrive ut alle parene med primtal, hvis sum er lik tallet som er oppgitt av brukeren. (foreslått av Aniseed) (Intermediate) 22. Utvikle et dyreklassifiseringsprogram basert på dyreriket. (for å praktisere bruken av innbyggerklasser). 23. Skriv et quiz-program, som henter spørsmål og svarer fra en fil. La deretter brukeren ta quizcount-poenget og returnere poengsummen. (Intermediate) 24. Skriv et program som aksepterer XHTML, analyserer og fjerner kodene. Deretter skriver den ut den gjenværende teksten. (Mellomliggende) 25. Skriv et program som utfører tillegg, subtraksjon, multiplikasjon av matriser. Dimensjonene til begge matriser vil bli spesifisert av brukeren (dynamisk minnefordeling kreves). Bruk av struktur eller en klasse for å definere matrisen ville være en god ide. (Intermediate) 26. Skriv et program som vil utføre jobben med å flytte filen fra ett sted til et annet. Kilden og destinasjonsbanen blir oppgitt av brukeren. Utfør den nødvendige feilkontrollen og håndter unntakene tilsvarende. (Intermediate) 27. Opprett en sofistikert kombinert liste klasse. Du bør kunne sette inn og slette noder hvor som helst i listen, og noderne skal ha pekere til noder både foran og bak dem. (Intermediate) 28. Lag et program som implementerer en database i C. Feltene er hardkodede, og dataene lagres i en binær fil. Selv om dette ikke er virkelig fleksibilitet, kan du ikke stole på noen eksterne biblioteker eller funksjoner. (Intermediate) Expert 1. Implementer din egen strstr. 2. Skriv et program som fungerte som en personlig planlegger. Som en bruker kan legge inn i hendelsen, noter ting å gjøre på en bestemt dato. 3. Tic Tac Toe-programmet. 4. Enkel filkryptering (ved hjelp av noe enkelt som ROT13. 5. Skriv et telefonadressebokprogram, med data lagring i binære filer. Brukerne skal kunne legge til utbytte av dataene. 6. Skriv et enkelt lønnsprogram, som vil inkludere lønnsrater , og timer arbeid for ansatte. 7. Lag noen klasser som modellen spillkort. Bruk deretter dette rammene til å lage ditt favorittkortspill. Blackjack..etc (ekspert) 8. Lag noen klasser som modell sjakkbrikker. Deretter utvikler du en ekte sjakkspill. (Ekspert) 9. Lag et binært tre som har søk og sorteringsfunksjoner. (Ekspert) 10. Lag en Quine, det vil si et program som skriver ut sin egen kildekode. (Ekspert) 11. Implementere din egen versjon av Standard Malbibliotek. (Ekspert) Grafikk 1. Skriv et program for å tegne et rektangel, ellipse, firkant, sirkel, punkt og linje basert på brukerinngang. (Begynner) 2. Skriv et program for å etterligne Microsoft Paint. være mulig å bytte mellom forskjellige verktøy (sirkel, rektangel, viskelær.) ved hjelp av pre-de bøyd nøkkelslag. Mellomliggende 3. Skriv et program for å plotte en enkel x-y-graf for en harkodet funksjon (for eksempel ycos (x)). Det bør være mulig å zoome inn på hvilken som helst del av grafen. - Mellomliggende. 4. Skriv et program for å tegne en graf av gitt ligning for form yf (x) og et område for x som kommandolinjeparametere. (for eksempel mygrafplotter-eqyxx-xmin-10, - xmax10) - Ekspert. (PS: mer å gjøre med likningsløsning enn grafikk) 5. Skriv det klassiske brick-break-out spillet. F. eks se DX Ball. Ekspert. Senest redigert 11. august 2008 kl 03:04 UTCGeneralt kan C og Java være like rask eller raskere fordi JIT-kompilatoren - en kompilator som kompilerer IL din første gang den utføres - kan gjøre optimaliseringer som et C-kompilert program kan ikke fordi det kan spørre maskinen. Det kan avgjøre om maskinen er Intel eller AMD Pentium 4, Core Solo eller Core Duo, eller hvis den støtter SSE4 osv. AC-programmet må kompileres på forhånd, vanligvis med blandede optimaliseringer slik at det går bra på alle maskiner, men det er ikke optimalisert så mye som det kan være for en enkelt konfigurasjon (dvs. prosessor, instruksjonssett, annen maskinvare). I tillegg tillater visse språkfunksjoner kompilatoren i C og Java å gjøre forutsetninger om koden din, slik at den kan optimalisere visse deler unna som bare ikke er sikker for CC-kompilatoren å gjøre. Når du har tilgang til pekere, er det mange optimeringer som bare ikke er sikre. Også Java og C kan gjøre bunttildelinger mer effektivt enn C fordi abstraksjonslaget mellom søppelsamleren og koden din gjør det mulig å gjøre hele sin bunke komprimering på en gang (en ganske dyr operasjon). Nå kan jeg ikke snakke for Java på dette neste punktet, men jeg vet at C for eksempel vil faktisk fjerne metoder og metallsamtaler når det vet at metoden er tom. Og det vil bruke denne typen logikk i hele koden din. Så som du kan se, er det mange grunner til at visse C - eller Java-implementeringer blir raskere. Nå er alt dette sagt, spesifikke optimaliseringer kan gjøres i C som vil blåse bort alt du kan gjøre med C, spesielt i grafikkrommet og når som helst du er nær maskinvaren. Pekere gjør underverk her. Så avhengig av hva du skriver, ville jeg gå med den ene eller den andre. Men hvis du skriver noe som ikke er maskinvareavhengig (driver, videospill osv.), Ville jeg ikke bekymre meg om ytelsen til C (igjen kan ikke snakke om Java). Det går bra. En Java-side, Swati påpeker en god artikkel: JIT vs Static Compiler Som allerede sagt i de forrige innleggene, kan JIT kompilere ILbytecode i innfødt kode ved kjøring. Kostnaden for det ble nevnt, men ikke til sin konklusjon: JIT har et stort problem, at det ikke kan kompilere alt: JIT-kompilering tar tid, så JIT vil kompilere bare noen deler av koden, mens en statisk kompilator vil produsere en full Innfødt binær: For noen form for programmer, vil den statiske kompilatoren enkelt enkelt overgå JIT. Selvfølgelig er C (eller Java eller VB) vanligvis raskere for å produsere levedyktig og robust løsning enn C (hvis bare fordi C har kompleks semantikk og C-standardbiblioteket, mens det er interessant og kraftig, er ganske dårlig sammenlignet med det fulle omfanget av standardbiblioteket fra eller Java), vanligvis vil forskjellen mellom C og Java JIT ikke være synlig for de fleste brukere, og for de binærene som er kritiske, kan du fortsatt ringe C-prosessering fra C eller Java (jevn hvis denne typen innfødte samtaler kan være ganske kostbare i seg selv). C metaprogrammering Merk at du vanligvis sammenligner C-kjøretidskoden med dens ekvivalent i C eller Java. Men C har en funksjon som kan overgå JavaC ut av boksen, det er malmetaprogrammering: Kodebehandlingen vil bli utført på kompileringstid (dermed øke stor kompileringstid), noe som resulterer i null (eller nesten null) runtime. Jeg har ennå ikke sett en virkningsfull effekt på dette (jeg spilte bare med konsepter, men da var forskjellen sekunder for utførelse for JIT, og null for C), men dette er verdt å nevne, i tillegg til at meta-programmering av mal er ikke triviell. Rediger 2011-06-10: I C, er det å spille med typer på kompileringstid, noe som betyr å produsere generisk kode som kaller ikke-generisk kode (f. eks. En generell parser fra streng til type T, ringer standard bibliotek API for typer T det gjenkjenner, og gjør parseren lett utvidbar av brukeren) er veldig enkel og svært effektiv, mens ekvivalenten i Java eller C er smertefull i beste fall å skrive, og vil alltid være langsommere og løst ved kjøretid selv når typene er kjent på kompileringstidspunktet, noe som betyr at ditt eneste håp er at JIT skal legge inn hele greia. Rediger 2011-09-20: Teamet bak Blitz (Hjemmeside Wikipedia) gikk på den måten, og tilsynelatende er målet deres å nå FORTRANs ytelse på vitenskapelige beregninger ved å flytte så mye som mulig fra kjøretid kjøring til kompileringstid, via C template metaprogramming . Så jeg har ennå så se en virkelighetseffekt på denne delen som jeg skrev over, eksisterer tilsynelatende ikke i virkeligheten. Native C Memory Usage C har en minnebruk forskjellig fra JavaC, og har dermed forskjellige fordeler. Uansett JIT optimalisering, vil ingenting gå raskt som direkte peker tilgang til minne (kan ignorere for et øyeblikk prosessor caches, etc.). Så, hvis du har sammenhengende data i minnet, får du tilgang til det gjennom C-pekere (det vil si C-pekere. La oss gi Caesar sin grunn) vil gå ganger raskere enn i JavaC. Og C har RAII, noe som gjør mye behandling enklere enn i C eller til og med i Java. C trenger ikke å bruke til å omfatte eksistensen av sine objekter. Og C har ikke en endelig klausul. Dette er ikke en feil. Og til tross for C-primitive-lignende strukturer, vil C på stakkobjektene ikke koste noe ved tildeling og ødeleggelse, og trenger ingen GC til å arbeide i en uavhengig tråne for å gjøre rengjøringen. Når det gjelder minnefragmentering, er minnetildelere i 2008 ikke de gamle minnetildelingene fra 1980 som vanligvis sammenlignes med en GC: C-tildeling, kan ikke flyttes i minnet, sant, men da, som på et Linux-filsystem: Hvem trenger defragmentering av harddisken når fragmentering skjer ikke Ved hjelp av den riktige allokeren til den rette oppgaven, bør det være en del av C-utviklerverktøyet. Nå er det ikke lett å skrive tildelere, og da har de fleste av oss bedre ting å gjøre, og for det meste er RAII eller GC mer enn godt nok. Rediger 2011-10-04: For eksempler om effektive tildelere: På Windows-plattformer, siden Vista, er Low Fragmentation Heap aktivert som standard. For tidligere versjoner kan LFH aktiveres ved å ringe WinAPI-funksjonen HeapSetInformation). På andre operativsystemer leveres alternative tildelere (se secure. wikimedia. orgwikipediaenwikiMalloc for en liste) Nå blir minnemodellen noe mer komplisert med veksten av multicore og multithreading teknologi. I dette feltet antar jeg at det er fordel, og Java ble fortalt, holdt den øvre bakken. Det er lett for noen på den bare metalhackeren å rose sin nær maskinens kode. Men nå er det ganske vanskeligere å produsere bedre samling for hånd enn å la kompilatoren til jobben sin. For C ble kompilatoren vanligvis bedre enn hacker siden et tiår. For C og Java er dette enda enklere. Den nye standarden C0x vil imidlertid stille en enkel minnemodell til C-kompilatorer, som vil standardisere (og dermed forenkle) effektiv multiprocessingparallelthreadcode i C, og gjøre optimaliseringer enklere og sikrere for kompilatorer. Men så, se vel om noen år hvis løftene holdes sanne. CCLI vs CVB Merk: I dette avsnittet snakker jeg om CCLI, det vil si C som er hostet av, ikke den innfødte C. I forrige uke hadde jeg opplæring i optimalisering, og oppdaget at den statiske kompilatoren i alle fall er svært viktig. Like viktig enn JIT. Den samme koden som er samlet i CCLI (eller dens forfader, Managed C) kan være ganger raskere enn den samme koden som produseres i C (eller VB, hvis kompilator produserer samme IL enn C). Fordi C-statisk kompilator var mye bedre å produsere allerede optimalisert kode enn Cs. For eksempel er funksjonen inlining in begrenset til funksjoner hvis bytekode er mindre eller lik enn 32 byte i lengde. Så, noen kode i C vil produsere en 40 byte accessor, som vanligvis ikke kommer inn i JIT. Den samme koden i CCLI vil produsere en 20 byte accessor, som vil bli innstilt av JIT. Et annet eksempel er midlertidige variabler, som enkelt blir kompilert av C-kompilatoren, mens de fortsatt er nevnt i IL produsert av C-kompilatoren. C-statisk kompileringsoptimalisering vil resultere i mindre kode, noe som igjen tillater en mer aggressiv JIT-optimalisering. Årsaken til dette var spekulert til å være det faktum at CCLI-kompilatoren var profitt fra de store optimaliseringsteknikkene fra C-innfødte kompilatoren. Konklusjon Men så langt jeg ser det, er C eller Java alt i alt en bedre innsats. Ikke fordi de er raskere enn C, men fordi de når opp med sine kvaliteter, blir de mer produktive, trenger mindre trening og har mer komplette standardbiblioteker enn C. Og for de fleste programmer, har deres hastighetsforskjeller (i ett vei eller annen) vil være ubetydelig. Rediger (2011-06-06) Min erfaring på C Jeg har nå 5 måneder med nesten eksklusiv profesjonell C-koding (som legger til min CV allerede full av C og Java, og et snev av CCLI). Jeg spilte med WinForms (Ahem.) Og WCF (cool), og WPF (Cool. Både gjennom XAML og rå C. WPF er så lett jeg tror Swing kan ikke sammenlignes med det), og C 4.0. Konklusjonen er at mens det er enklere å produsere en kode som virker i CJava enn i C, er det mye vanskeligere å lage en sterk, sikker og robust kode i C (og enda vanskeligere i Java) enn i C. Årsaker florerer, men det kan oppsummeres av: Generics er ikke like kraftige som maler (prøv å skrive en effektiv generisk Parse-metode (fra streng til T), eller en effektiv ekvivalent av boost: lexicalcast i C for å forstå problemet) RAII forblir uovertruffen (GC fortsatt kan lekke (ja, jeg måtte takle det problemet) og vil bare håndtere minne. Selv Cs bruker ikke så lett og kraftig fordi du skriver riktig. Kast implementeringer er vanskelig. C readonly og Java final er ikke så nyttig som Cs const (Theres ingen måte at du kan eksponere lett-kompliserte data (for eksempel et Tree of Noces) i C uten enormt arbeid, mens det er en innebygd funksjon av C. Immutable data er en interessant løsning, men ikke alt kan gjøres uendelig, så det er ikke engang nok, langt). Så, C er et hyggelig språk så lenge du vil ha noe som fungerer, men et frustrerende språk i øyeblikket du vil ha noe som alltid og sikkert fungerer. Java er enda mer frustrerende, da det har de samme problemene som C, og mer: Mangler ekvivalent av Cs ved hjelp av søkeord, brukte en svært dyktig kollega min for mye tid til å sørge for at ressursene der det var riktig frigjort, mens ekvivalenten i C ville har vært lett (ved hjelp av destruktorer og smarte pekere). Så jeg antar at CJavas produktivitetsøkning er synlig for de fleste kode. til dagen du trenger koden skal være så perfekt som mulig. Den dagen vil du vite smerte. (du vil ikke tro hva som er spurt av våre server - og GUI-apper.). Om server-side Java og C Jeg holdt kontakt med serverteamene (jeg jobbet 2 år blant dem, før jeg kom tilbake til GUI-teamet), på den andre siden av bygningen, og jeg lærte noe interessant. I de siste årene var trenden å få Java-serverappene til å erstatte de gamle C-serverappene, da Java har mange rammeverk, og det er lett å vedlikeholde, distribuere, osv. Osv. Inntil problemet med lav latens oppdrettet sitt stygge hode de siste månedene. Da, Java-tjenerappene, uansett optimaliseringen forsøkt av vår dyktige Java-team, mistet og slett rase mot den gamle, ikke virkelig optimaliserte C-serveren. Foreløpig er beslutningen om å holde Java-serverne til vanlig bruk, hvor ytelsen samtidig som den er viktig, ikke er opptatt av lavt ventetid, og aggressivt optimaliserer de allerede raskere C-serverapplikasjonene for lavt ventetid og ultra-lav-latensbehov. Konklusjon Ingenting er like enkelt som forventet. Java, og enda mer C, er kule språk, med omfattende standardbiblioteker og rammer, hvor du kan kode raskt, og har svært mange resultater. Men når du trenger rå strøm, kraftige og systematiske optimaliseringer, sterk kompilatorstøtte, kraftige språkfunksjoner og absolutt sikkerhet, gjør Java og C det vanskelig å vinne de siste manglende, men kritiske kvalitetsprosentene du trenger for å forbli over konkurransen. Det er som om du trengte mindre tid og mindre erfarne utviklere i CJava enn i C for å produsere gjennomsnittlig kvalitetskode, men i det øyeblikket du trengte utmerket til perfekt kvalitetskode, var det plutselig enklere og raskere å få resultatene rett inn C. Dette er selvfølgelig min egen oppfatning, kanskje begrenset til våre spesifikke behov. Men det er det som skjer i dag, både i GUI-lagene og server-side-lagene. Selvfølgelig oppdaterer jeg dette innlegget hvis noe nytt skjer. Rediger (2011-06-22) Vi finner at med hensyn til ytelse, vinder C ut med en stor margin. Men det krevde også den mest omfattende tuning-innsatsen, hvorav mange ble gjort på et nivå av raffinement som ikke ville være tilgjengelig for den gjennomsnittlige programmereren. . Java-versjonen var sannsynligvis den enkleste å implementere, men det vanskeligste å analysere for ytelse. Spesielt var effektene rundt søppelsamling komplisert og svært vanskelig å stille. Rediger (2011-09-20) Gode ord på Facebook er at rimelig skrevet C-kode bare går fort, noe som understreker den enorme innsatsen brukt ved optimalisering av PHP og Java-kode. Paradoksalt nok er C-kode vanskeligere å skrive enn i andre språk, men effektiv kode er mye lettere å skrive i C enn på andre språk. quotKoden behandling vil bli gjort på kompilering timequot. Derfor virker malmetaprogrammering bare i programmet tilgjengelig på kompileringstid, hvilket ofte ikke er tilfellet, f. eks. Det er umulig å skrive et konkurransedyktig utførende regelmessig ekspresjonsbibliotek i vanilje C fordi det ikke er i stand til å generere run-time-kodegenerering (et viktig aspekt ved metaprogrammering). ndash Jon Harrop Jan 17 12 kl 10:08 Når jeg snakker klarte vs ukontrollert ytelse, liker jeg å peke på serien Rico (og Raymond) sammenlignet C og C versjoner av en kinesisk engelsk ordbok. Dette google-søket lar deg lese for deg selv, men jeg liker Ricos sammendrag. Så skammer jeg meg ved min knusende nederlag. Den administrerte koden fikk et veldig godt resultat for knapt noen innsats. For å beseire den forvaltede Raymond måtte: Skrive sin egen fil IO ting Skrive sin egen snorklasse Skrive sin egen tildeler Skrive sin egen internasjonale kartlegging Selvfølgelig brukte han tilgjengelige lavere nivå biblioteker for å gjøre dette, men det er fortsatt mye arbeid. Kan du ringe hva som forlot et STL-program Jeg tror ikke det, jeg tror han holdt std :: vektorklassen som i siste instans aldri var et problem, og han holdt finnfunksjonen. Ganske mye alt annet er borte. Så, du kan definitivt slå CLR. Raymond kan få sitt program til å gå enda raskere jeg tror. Interessant er tiden for å analysere filen som rapportert av begge programmene interne timere omtrent det samme - 30 ms for hver. Forskjellen er i overhead. For meg er bunnlinjen at det tok 6 revisjoner for den ubehandlede versjonen å slå den administrerte versjonen som var en enkel port i den opprinnelige ustyrte koden. Hvis du trenger hver siste bit av ytelse (og har tid og kompetanse for å få det), må du gå uhåndtert, men for meg, Ill tar størrelsesordenens fordel jeg har på de første versjonene over de 33 jeg får hvis jeg prøv 6 ganger. Først av alt, hvis vi ser på Raymond Chen39s kode, forstår han tydeligvis ikke C eller datastrukturer veldig bra. Koden hans når nesten rett til C-kode på lavt nivå, selv om C-koden ikke har noen ytelsesfordeler (det synes bare å være en slags mistillit og kanskje mangel på kunnskap om hvordan man bruker profiler). Han klarte heller ikke å forstå den mest algoritmisk forsvarlige måten å implementere en ordbok på (han brukte std :: finne for Kristi skyld). Hvis det er noe bra om Java, Python, C, etc. - de alle gir svært effektive ordbøker. ndash stinky472 28 feb 12 kl 18:26 Tries eller til og med std :: kartet ville fare mye mer gunstig mot C eller til og med et hashbord. Endelig er en ordbok akkurat den typen program som har størst nytte av biblioteker og rammer på høyt nivå. Det viser ikke forskjeller på språket så mye som de involverte bibliotekene (som jeg gjerne sier at C er langt mer komplett og gir mye mer verktøy som passer for oppgaven). Vis et program som manipulerer store blokker med minne i sammenligning, som en storskala matrixvektorkode. Det kommer til å avgjøre dette ganske raskt, selv om, som i dette tilfellet, ikke kodene vet hva. ndash stinky472 28 feb 12 kl 18:29 Det er ikke så mye at du kompilerer for CPU-optimalisering, men du samler for kjøretidspor optimalisering. Hvis du finner ut at en metode ofte kalles med en bestemt parameter, kan du forhåndskompilere denne rutinen med parameteren som en konstant som kunne (i tilfelle av en boolsk som kontrollerer flyt) faktor ut gigantiske arbeidsstykker. C kan ikke komme nær å gjøre den typen optimalisering. ndash Bill K 9 okt 09 kl 17:42 Så hvordan gjør JITs på å kompilere rutiner for å utnytte observerte runpaths, og hvor mye forskjell gjør det da? David Thornley Dec 3 09 kl 21:50 Hardy ja, CPU kan gjøre avdeling prediksjon uavhengig av språk, men det kan ikke faktorere ut en hel sløyfe ved å observere at sløyfen ikke har noen effekt på noe. Det vil heller ikke bemerkes at mult (0) er fastkoblet for å returnere 0 og bare erstatte hele metallsamtalen med hvis (param 0) result0 og unngå hele funksjonsmetodeanropet. C kunne gjøre disse tingene hvis kompilatoren hadde en omfattende oversikt over hva som skjedde, men generelt har det ikke nok informasjon på kompileringstidspunktet. ndash Bill K 8. september kl 17:26 JIT (Just In Time Compiling) kan være utrolig rask fordi den optimaliserer for målplattformen. Dette betyr at det kan utnytte noen kompilertrikkel, som CPUen din kan støtte, uansett hvilken CPU utvikleren skrev koden på. Basisbegrepet for JIT fungerer som dette (tungt forenklet): Kaller en metode for første gang: Programkoden kaller en metode Foo () CLR ser på typen som implementerer Foo () og får metadataene knyttet til det Fra Metadata, CLR vet hvilken minneadresse IL (Intermediate byte code) er lagret i. CLR tildeler en blokk med minne, og kaller JIT. JIT kompilerer IL til innfødt kode, plasserer den i det tildelte minnet, og endrer deretter funksjonspekeren i Foo () s-metadata for å peke på denne innfødte koden. Den opprinnelige koden er løpende. Kaller en metode for andre gang: Programkoden kaller en metode Foo () CLR ser på typen som implementerer Foo () og finner funksjonspekeren i metadataene. Den opprinnelige koden på denne minnestedet er kjørt. Som du kan se, den andre gangen, er det praktisk talt den samme prosessen som C, unntatt med fordelen av realoptidsoptimeringer. Når det er sagt, er det fortsatt andre overheadproblemer som reduserer et styrt språk, men JIT hjelper mye. Vel, det er basert på ideen om at en kompilators39 optimizer følger regler og kodere ikke. Så det vil alltid være kode som optimalisereren finner det kan ikke optimalisere perfekt, mens et menneske kunne, enten ved å se på et større bilde eller vite mer om hva koden egentlig gjør. I39ll legger til at dette er en 3 år gammel kommentar, og jeg vet mer om HotSpot enn jeg pleide å, og jeg kan enkelt se dynamisk optimalisering som en veldig fin måte å få koden til å kjøre raskere. ndash billjamesdev 14 Jul 11 ​​kl 6:03 1. Optimeringer fra Hotspot eller andre JIT er fortsatt kompilatoroptimaliseringer. JIT har fordelen over en statisk kompilator for å kunne legge inn noen resultater (kode ofte kalt), eller til og med å foreta optimaliseringer basert på den utførte prosessoren, men det er fortsatt en kompilatoroptimalisering. 2. Jeg antar at du snakker om algoritmeoptimalisering, ikke quoteassembly fine tuningquot. kvadratisk montering finjustering av en human coderquot klarte ikke å produsere bedre resultater enn kompilatoroptimaliseringer siden mer enn et tiår. Faktisk skruer en menneskelig lek med montering vanligvis bort optimalisering. ndash paercebal 14 Jul 11 ​​kl 16:46 Ok, jeg forstår at jeg bruker den riktige terminologien, quotcompiler optimiziationquot heller enn quotastatic optimizationquot. Jeg vil påpeke at i hvert fall i spillbransjen, så nylig som for PS2, brukte vi fremdeles håndkodede forsamlinger på steder for å quotoptimizequot for de spesifikke sjetongene vi visste var på konsollkorset, da disse nye sjetongene ikke var ennå så sofistikert som for x86-arkitekturer. Tilbake til det opprinnelige spørsmålet ovenfor: JIT har fordelen av å kunne måle før optimalisering, noe som er en god ting ndash billjamesdev 14. juli kl. 17:53 Du bør definere utføre bedre enn ... Vel, jeg vet du spurte om hastighet, men det er ikke alt som teller. Gjør virtuelle maskiner mer runtime overhead Ja, de spiser mer arbeidsminne Ja Har de høyere oppstartskostnader (kjøretid initialisering og JIT compiler). Ja Har de behov for et stort bibliotek installert Ja Og så videre, dens partisk, ja) Med C og Java betaler du en pris for hva du får (raskere koding, automatisk minnehåndtering, stort bibliotek og så videre). Men du har ikke mye plass til å prute om detaljene: Ta hele pakken eller ingenting. Selv om disse språkene kan optimalisere noen kode for å utføre raskere enn kompilert kode, er hele tilnærmingen (IMHO) ineffektiv. Tenk deg å kjøre hver dag 5 miles til arbeidsplassen din, med en lastebil. Det er behagelig, det føles bra, du er trygg (ekstrem krumplingssone), og etter at du har gått på gassen en stund, vil den til og med være så rask som en vanlig bil Hvorfor ikke alle har en lastebil til å kjøre på jobb) I C får du det du betaler for, ikke mer, ikke mindre. Sitat Bjarne Stroustrup: C er min favoritt søppel samlet språk fordi det genererer så lite søppelkoblingstekst Stroustrup har ikke sett noen av koden jeg har. ndash kyoryu Dec 4 09 at 3:29 Vel, jeg tror han har en god ide om sine ulemper, han sa også: quotC gjør det enkelt å skyte deg selv i foten C gjør det vanskeligere, men når du gjør det blåser hele benet offquot) ndash Frunsi 4. desember klokken 11:24 c. Du får det du betaler for, ikke mer, ikke mindre. Teller eksempel: Jeg benchmarked en RB tree implementering i OCaml og C (GNU GCC) som brukte et unntak til langhopp ut fra rekursjonen hvis et element som ble lagt til allerede var tilstede for å gjenbruke det eksisterende settet. OCaml var opptil 6x raskere enn C fordi det ikke betaler for å sjekke destructors ettersom stakken er viklet ut. ndash Jon Harrop Sep 5 11 kl 23:10 Jon: men på noen (senere) tidspunkt må det ødelegge objektene uansett (i det minste må det frigjøre minnet). Og merk også at unntak er for eksepsjonelle tilfeller, i hvert fall i C, at regelen bør respekteres. C unntak kan være tung når unntak oppstår, det er en avgang. ndash Frunsi 6 sep 11 kl 19:19 Noen gode svar her om det spesifikke spørsmålet du spurte. Jeg liker å gå tilbake og se på det større bildet. Husk at brukerens oppfatning av hastigheten på programvaren du skriver, påvirkes av mange andre faktorer enn hvor godt kodegen optimaliserer. Her er noen eksempler: Manuell minnestyring er vanskelig å gjøre riktig (ingen lekkasjer), og enda vanskeligere å gjøre effektivt (gratis minne kort tid etter at du har gjort det). Bruke en GC er generelt mer sannsynlig å produsere et program som styrer minnet godt. Are you willing to work very hard, and delay delivering your software, in an attempt to out-do the GC My C is easier to read amp understand than my C. I also have more ways to convince myself that my C code is working correctly. That means I can optimize my algorithms with less risk of introducing bugs (and users dont like software that crashes, even if it does it quickly) I can create my software faster in C than in C. That frees up time to work on performance, and still deliver my software on time. Its easier to write good UI in C than C, so Im more likely to be able to push work to the background while UI stays responsive, or to provide progress or hearbeat UI when the program has to block for a while. This doesnt make anything faster, but it makes users happier about waiting. Everything I said about C is probably true for Java, I just dont have the experience to say for sure. The virtual machine languages are unlikely to outperform compiled languages but they can get close enough that it doesnt matter, for (at least) the following reasons (Im speaking for Java here since Ive never done C). 1 The Java Runtime Environment is usually able to detect pieces of code that are run frequently and perform just-in-time (JIT) compilation of those sections so that, in future, they run at the full compiled speed. 2 Vast portions of the Java libraries are compiled so that, when you call a library function, youre executing compiled code, not interpreted. You can see the code (in C) by downloading the OpenJDK. 3 Unless youre doing massive calculations, much of the time your program is running, its waiting for input from a very slow (relatively speaking) human. 4 Since a lot of the validation of Java bytecode is done at the time of loading the class, the normal overhead of runtime checks is greatly reduced. 5 At the worst case, performance-intensive code can be extracted to a compiled module and called from Java (see JNI) so that it runs at full speed. In summary, the Java bytecode will never outperform native machine language, but there are ways to mitigate this. The big advantage of Java (as I see it) is the HUGE standard library and the cross-platform nature. Re item 2, quot2 Vast portions of the Java libraries are compiled so that, when you call a library function, you39re executing compiled code, not interpretedquot: Do you have a citation for that If it were really as you describe, I39d expect to run into native code from my debugger a lot, but I don39t. ndash cero Sep 28 08 at 22:46 Re: cero Debuggers often utilize less efficient but more expressive paths, and are therefore not a good marker for anything performance related. ndash Guvante Oct 7 08 at 18:35 Orion Adrian. let me invert your post to see how unfounded your remarks are, because a lot can be said about C as well. And telling that JavaC compiler optimize away empty functions does really make you sound like you are not my expert in optimization, because a) why should a real program contain empty functions, except for really bad legacy code, b) that is really not black and bleeding edge optimization. Apart from that phrase, you ranted blatantly about pointers, but dont objects in Java and C basically work like C pointers May they not overlap May they not be null C (and most C implementations) has the restrict keyword, both have value types, C has reference-to-value with non-null guarantee. What do Java and C offer Generally, C and C can be just as fast or faster because the AOT compiler -- a compiler that compiles your code before deployment, once and for all, on your high memory many core build server -- can make optimizations that a C compiled program cannot because it has a ton of time to do so. The compiler can determine if the machine is Intel or AMD Pentium 4, Core Solo, or Core Duo or if supports SSE4, etc, and if your compiler does not support runtime dispatch, you can solve for that yourself by deploying a handful of specialized binaries. A C program is commonly compiled upon running it so that it runs decently well on all machines, but is not optimized as much as it could be for a single configuration (i. e. processor, instruction set, other hardware), and it must spend some time first. Features like loop fission, loop inversion, automatic vectorization, whole program optimization, template expansion, IPO, and many more, are very hard to be solved all and completely in a way that does not annoy the end user. Additionally certain language features allow the compiler in C or C to make assumptions about your code that allows it to optimize certain parts away that just arent safe for the JavaC compiler to do. When you dont have access to the full type id of generics or a guaranteed program flow theres a lot of optimizations that just arent safe. Also C and C do many stack allocations at once with just one register incrementation, which surely is more efficient than Javas and C allocations as for the layer of abstraction between the garbage collector and your code. Now I cant speak for Java on this next point, but I know that C compilers for example will actually remove methods and method calls when it knows the body of the method is empty, it will eliminate common subexpressions, it may try and retry to find optimal register usage, it does not enforce bounds checking, it will autovectorize loops and inner loops and will invert inner to outer, it moves conditionals out of loops, it splits and unsplits loops. It will expand std::vector into native zero overhead arrays as youd do the C way. It will do inter procedural optimmizations. It will construct return values directly at the caller site. It will fold and propagate expressions. It will reorder data into a cache friendly manner. It will do jump threading. It lets you write compile time ray tracers with zero runtime overhead. It will make very expensive graph based optimizations. It will do strength reduction, were it replaces certain codes with syntactically totally unequal but semantically equivalent code (the old xor foo, foo is just the simplest, though outdated optimization of such kind). If you kindly ask it, you may omit IEEE floating point standards and enable even more optimizations like floating point operand re-ordering. After it has massaged and massacred your code, it might repeat the whole process, because often, certain optimizations lay the foundation for even certainer optimizations. It might also just retry with shuffled parameters and see how the other variant scores in its internal ranking. And it will use this kind of logic throughout your code. So as you can see, there are lots of reasons why certain C or C implementations will be faster. Now this all said, many optimizations can be made in C that will blow away anything that you could do with C, especially in the number crunching, realtime and close-to-metal realm, but not exclusively there. You dont even have to touch a single pointer to come a long way. So depending on what youre writing I would go with one or the other. But if youre writing something that isnt hardware dependent (driver, video game, etc), I wouldnt worry about the performance of C (again cant speak about Java). Itll do just fine. ltltltltltltltltltlt Generally, certain generalized arguments might sound cool in specific posts, but dont generally sound certainly credible. Anyways, to make peace: AOT is great, as is JIT . The only correct answer can be: It depends. And the real smart people know that you can use the best of both worlds anyways. In some cases, managed code can actually be faster than native code. For instance, mark-and-sweep garbage collection algorithms allow environments like the JRE or CLR to free large numbers of short-lived (usually) objects in a single pass, where most CC heap objects are freed one-at-a-time. For many practical purposes, allocationdeallocation-intensive algorithms implemented in garbage collected languages can actually be faster than their equivalents using manual heap allocation. A major reason for this is that the garbage collector allows the runtime system to amortize allocation and deallocation operations in a potentially advantageous fashion. That said, Ive written a lot of C and a lot of C, and Ive run a lot of benchmarks. In my experience, C is a lot faster than C, in two ways: (1) if you take some code that youve written in C, port it to C the native code tends to be faster. How much faster Well, it varies a whole lot, but its not uncommon to see a 100 speed improvement. (2) In some cases, garbage collection can massively slow down a managed application. The CLR does a terrible job with large heaps (say, 2GB), and can end up spending a lot of time in GC--even in applications that have few--or even no--objects of intermediate life spans. Of course, in most cases that Ive encounted, managed languages are fast enough, by a long shot, and the maintenance and coding tradeoff for the extra performance of C is simply not a good one. Of course, the question is whether we39re comparing an implementation of a program in managed vs. unmanaged code, or the theoretical top performance of the language. Clearly, unmanaged code can always be at least as fast as managed, as in the worst case you could just write an unmanaged program that did exactly the same thing as the managed code But most performance issues are algorithmic, not micro. Also, you don39t optimize managed and unmanaged code the same way, so quotC in Cquot is usually going to not work well. ndash kyoryu Dec 4 09 at 3:27 In CC you can allocate short lived objects on the stack, and you do when its appropriate. In managed code you cannot . you have no choice. Also, in CC you can allocate lists of objects in contigous areas (new Foo100), in managed code you cannot. So, your comparison is not valid. Well, this power of choices places a burden on the developers, but this way they learn to know the world they live in (memory. ). ndash Frunsi Dec 6 09 at 3:39 Go read about HP Labs Dynamo. an interpreter for PA-8000 that runs on PA-8000, and often runs programs faster than they do natively. Then it wont seem at all surprising Dont think of it as an intermediate step -- running a program involves lots of other steps already, in any language. It often comes down to: programs have hot-spots, so even if youre slower running 95 of the body of code you have to run, you can still be performance-competitive if youre faster at the hot 5 a HLL knows more about your intent than a LLL like CC, and so can generate more optimized code (OCaml has even more, and in practice is often even faster) a JIT compiler has a lot of information that a static compiler doesnt (like, the actual data you happen to have this time) a JIT compiler can do optimizations at run-time that traditional linkers arent really allowed to do (like reordering branches so the common case is flat, or inlining library calls) All in all, CC are pretty lousy languages for performance: theres relatively little information about your data types, no information about your data, and no dynamic runtime to allow much in the way of run-time optimization. My understanding is that CC produces native code to run on a particular machine architecture. Conversely, languages like Java and C run on top of a virtual machine which abstracts away the native architecture. Logically it would seem impossible for Java or C to match the speed of C because of this intermediate step, however Ive been told that the latest compilers (hot spot) can attain this speed or even exceed it. That is illogical. The use of an intermediate representation does not inherently degrade performance. For example, llvm-gcc compiles C and C via LLVM IR (which is a virtual infinite-register machine) to native code and it achieves excellent performance (often beating GCC). Perhaps this is more of a compiler question than a language question, but can anyone explain in plain English how it is possible for one of these virtual machine languages to perform better than a native language Here are some examples: Virtual machines with JIT compilation facilitate run-time code generation (e. g. System. Reflection. Emit on ) so you can compile generated code on-the-fly in languages like C and F but must resort to writing a comparatively-slow interpreter in C or C. For example, to implement regular expressions. Parts of the virtual machine (e. g. the write barrier and allocator) are often written in hand-coded assembler because C and C do not generate fast enough code. If a program stresses these parts of a system then it could conceivably outperform anything that can be written in C or C. Dynamic linking of native code requires conformance to an ABI that can impede performance and obviates whole-program optimization whereas linking is typically deferred on VMs and can benefit from whole-program optimizations (like s reified generics). Id also like to address some issues with paercebals highly-upvoted answer above (because someone keeps deleting my comments on his answer) that presents a counter-productively polarized view: The code processing will be done at compilation time. Hence template metaprogramming only works if the program is available at compile time which is often not the case, e. g. it is impossible to write a competitively performant regular expression library in vanilla C because it is incapable of run-time code generation (an important aspect of metaprogramming). playing with types is done at compile time. the equivalent in Java or C is painful at best to write, and will always be slower and resolved at runtime even when the types are known at compile time. In C, that is only true of reference types and is not true for value types. No matter the JIT optimization, nothing will go has fast as direct pointer access to memory. if you have contiguous data in memory, accessing it through C pointers (i. e. C pointers. Lets give Caesar its due) will goes times faster than in JavaC. People have observed Java beating C on the SOR test from the SciMark2 benchmark precisely because pointers impede aliasing-related optimizations. Also worth noting that does type specialization of generics across dynamically-linked libraries after linking whereas C cannot because templates must be resolved before linking. And obviously the big advantage generics have over templates is comprehensible error messages. C Fundamentals for Borland C Builder 2012-05-14 04:31:36 By Console77 Version: C Fundamentals for Borland C Builder 6.0 Easy for beginners, else none - No reliable internet components - Simple graphics, unless you dare rely on thirds party VCLs - No 64bit support - Buggy - Thirdparty VCLs are also buggy - Not a standard product - Less and less vendors supports DelphiC Builder - Insecure future, a sinking ship Embarcadero and their products are a sinking ship, together with the third party tools. There are always problems, bugs, or simply a connectivity is not supported. You never know if it is You, the third part VCL vendor or Emarcadero creating the problems. We have used an obsene amount of time in error finding, debugging. There is still no support for 64bit in C Builder, and the datasnap is unreliable, new releases are always buggy. Emrabadero has no reliable internet connectivity, but rely on Indy, which is unreliable and very difficult to manage. We now face more and more that we need to add plug-ins to our application, but they are not supporting Delphi C Builder. So, we now have to migrate to the standard, which is Visual Studio 2010. Perhaps for hobby projects DelphiC Builder is ok - but not for commercial applications. 34I use before old version34

No comments:

Post a Comment