AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Seltsame Berechnung mit <sizeOf>

Ein Thema von Dannyboy · begonnen am 20. Aug 2004 · letzter Beitrag vom 20. Aug 2004
Antwort Antwort
Seite 1 von 3  1 23      
Dannyboy

Registriert seit: 4. Aug 2003
Ort: Delphi-Heaven
418 Beiträge
 
Delphi 7 Personal
 
#1

Seltsame Berechnung mit <sizeOf>

  Alt 20. Aug 2004, 12:39
Hallo Freunde des kleinen Ein-Mal-Eins,
wenn ich mir ansehe, dass laut der Funktion <sizeOf>
8 + 2 zu dem Resultat 16 kommt, dann frage ich mich,
ob ich bisher im Themengebiet der Mathematik etwas
verpasst habe. Ich dachte immer, ich hätte das kleine
Ein-Mal-Eins drauf
Folgendes Problem:
Delphi-Quellcode:
  var b : byte;
//...
  b:= SizeOf(int64); // b = 8;
  b:= SizeOf(word); // b = 2;
// Bis hier hin is' alles cool, aber ...
  type TLevelSize = record
                      width : int64; // 8 Bytes
                      height : word; // 2 Bytes
                    end;
//...
b:= SizeOf(TLevelSize) // b = 16 // hääääää??
Das möge man mir bitte erklären.
How much wood would a wood-chuck chuck if a wood-chuck would chuck wood?
Check this out.
DANNYBOY
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Seltsame Berechnung mit <sizeOf>

  Alt 20. Aug 2004, 12:41
Hi,

probier statt record den packed record

Zitat von Onlinehilfe:
Per Voreinstellung sind die Werte in einem strukturierten Typ in einem Word- oder Double-Word-Raster ausgerichtet, um den Zugriff zu beschleunigen. Wenn Sie einen strukturierten Typ deklarieren, können Sie das reservierte Wort packed einfügen, um die Daten in komprimierter Form zu speichern:
Dani H.
At Least I Can Say I Tried
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#3

Re: Seltsame Berechnung mit <sizeOf>

  Alt 20. Aug 2004, 12:43
Delphi-Quellcode:
type
  TLevelSize = record
    Width : Int64; // 8 Bytes
    Height: Word; // 8 Bytes
  end;
Die Ausrichtung findet anhand des größten Members statt. Die Ausrichtung wirkt sich (beim Delphi-Compiler) auch auf das 'Ende' des Records aus.
  Mit Zitat antworten Zitat
Dannyboy

Registriert seit: 4. Aug 2003
Ort: Delphi-Heaven
418 Beiträge
 
Delphi 7 Personal
 
#4

Re: Seltsame Berechnung mit <sizeOf>

  Alt 20. Aug 2004, 13:04
Hi Dani, hi NicoDe,
seltsamerweise speichert er die 16 Bytes dann auch
in der Datei! Das gefällt mir nicht so.
Wenn ich einen Packed Record verwende, hoffe ich,
dass die Performance nicht darunter leidet. Weil dann wäre
das alles umsonst. Was meint ihr?
How much wood would a wood-chuck chuck if a wood-chuck would chuck wood?
Check this out.
DANNYBOY
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#5

Re: Seltsame Berechnung mit <sizeOf>

  Alt 20. Aug 2004, 13:08
Zitat von Dannyboy:
dass die Performance nicht darunter leidet.
Auf einem x86 wird es nicht auffallen. Auf Alpha/PPC (Windows NT 4.0) wird der Zugriff auf ein array of TFoo langsamer sein. Auf einem AMD64 (Windows x64) gibt es das gleiche Problem wie beim Alpha und PPC.
Das Schreiben der Records ist davon nicht betroffen.

ps: als Anhaltspunkt für Windows x64 (AMD64/EMT64), die Performance könnte im ungünstigen Fall auf ca. die Hälfte sinken.
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#6

Re: Seltsame Berechnung mit <sizeOf>

  Alt 20. Aug 2004, 13:08
es wird voraussichtlich langsamer. aber nicht so schrecklich viel.

edit:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TLevelSize = record
    Width : Int64; // 8 Bytes
    Height: Word; // 8 Bytes
  end;

  type
  TLevelSize2 = packed record
    Width : Int64; // 8 Bytes
    Height: Word; // 8 Bytes
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
const max = 10000;
var i,j: integer; t: cardinal; a: array[0..max] of tlevelsize; b: array[0..max] of tlevelsize2;
begin
{$O-}
t:= gettickcount;
for i := 0 to max do
begin
for j := 0 to max do begin
a[i].Width := 0;
a[i].Height := 0;
end; end;
showmessage(inttostr(gettickcount - t));
t:= gettickcount;
for i := 0 to max do
for j := 0 to max do begin
begin
b[i].Width := 0;
b[i].Height := 0;
end; end;
showmessage(inttostr(gettickcount - t));
end;

end.
sorry für scheiss formatierung. aber in dem fall sinds ca 30% verlust. wenn man die arrays wegmacht, und immer auf dem gleichen record rumschreibt, dann gehts in der packed version sogar schneller.
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
Dannyboy

Registriert seit: 4. Aug 2003
Ort: Delphi-Heaven
418 Beiträge
 
Delphi 7 Personal
 
#7

Re: Seltsame Berechnung mit <sizeOf>

  Alt 20. Aug 2004, 13:15
Igitt !!!
Nö, bei Performanceverlust werde ich auf den Record verzichten und die Daten eher sequentiell ein - und auslesen, ergo erst <width>, dann <height>. So einfach ist das!
How much wood would a wood-chuck chuck if a wood-chuck would chuck wood?
Check this out.
DANNYBOY
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Seltsame Berechnung mit <sizeOf>

  Alt 20. Aug 2004, 13:15
Zitat von Dannyboy:
Hi Dani, hi NicoDe,
seltsamerweise speichert er die 16 Bytes dann auch
in der Datei! Das gefällt mir nicht so.
Äh, wie meinen? Wie speicherst du denn das bitte? Dass der Datensatz 16 byte groß ist? Ist ja auch irgendwie logisch oder?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#9

Re: Seltsame Berechnung mit <sizeOf>

  Alt 20. Aug 2004, 13:16
siehe mein edit oben
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
Dannyboy

Registriert seit: 4. Aug 2003
Ort: Delphi-Heaven
418 Beiträge
 
Delphi 7 Personal
 
#10

Re: Seltsame Berechnung mit <sizeOf>

  Alt 20. Aug 2004, 13:26
Zitat von Luckie:
Äh, wie meinen? Wie speicherst du denn das bitte? Dass der Datensatz 16 byte groß ist? Ist ja auch irgendwie logisch oder?
Moin Luckie,
logisch erscheint mir eher, dass int64 (8 Bytes) + word (2 bytes) insgesamt 10 Bytes ergeben.
Delphi-Quellcode:
var lSize : TLevelSize;
//...
Filestream.write(lSize, sizeOf(TLevelSize)); // 16 Bytes
//...
Wie gesagt, ich werde die Daten jetzt einzeln ein - und einzeln auslesen. Spricht was für
einen anderen Vorschlag?
How much wood would a wood-chuck chuck if a wood-chuck would chuck wood?
Check this out.
DANNYBOY
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz