Announcement

Collapse
No announcement yet.

Performance Delphi 8 mit VCL.NET

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Performance Delphi 8 mit VCL.NET

    Hallo Andreas,

    Du bemängelst immer wieder den Performancenachteil von VCL.NET-Anwendungen gegenüber von FCL-Anwendungen, da VCL.NET sehr viel Gebrauch von P/Inoke macht und damit um einiges langsamer als z.B. mit Delphi 7.

    Da FCL/WinForms im Hintergrund eigentlich auch nichts anderes macht (es greift ja auch auf die Win32-Controls zu) ist meine Frage wieso VCL.NET langsame ist als FCL/WinForms?

    Ist es ein Problem von Delphi (P/Invoke benötigt bei Delphi einen größeren "Sicherheitsrahmen") oder hat hier MS mal wieder getrickst (.NET-Framework verzeichtet bei den .NET-Systemassemblies auf diesen "Sicherheitsrahmen").

  • #2
    Hallo,

    >..oder hat hier MS mal wieder getrickst...

    es ist das Privileg des Framework-Herstellers (Microsoft vs. Mono), die eigenen Assemblies als sicher zu klassifizieren. Microsoft hat über die Code Group <i>ECMA_Strong_Name</i> sogar einen Platzhalter für Drittanbieter davor vorgesehen. Und wenn man sich die einzelnen Assemblies aus dem originalen .NET Framework einmal anschaut, haben auch nur wenige davon das Attribut <i>AllowPartiallyTrustedCallersAttribute</i> - sogar Microsoft traut nicht allen seinen eigenen Teilen ;-)

    Alle fremden Assemblies (die nicht zum .NET Framework) gehören, müssen sich somit strengeren Regeln unterwerfen. Wie ein kurzer Blick in die Delphi-Units <i>Borland.Vcl.Messages.pas, Borland.Vcl.ComCtrls.pas, Borland.Vcl.Controls.pas, Borland.Vcl.Forms.pas, Borland.Vcl.Menus</i> und <i>
    Borland.Vcl.StdCtrls.pas</i> zeigt, nutzt Borland im <i>Implementation</i>-Abschnitt verschiedenen Units das Attribut <i>SuppressUnmangedCodeSecurity</i>, um die Prüfung nur einmal zum JIT-Compiler-Aufruf ablaufen zu lassen. Aber im <i>Interface</i>-Abschnitt darf aus Sicherheitsgründen niemals dieses Attribut auftauchen, wenn nicht ein riesiges Loch im Zaun entstehen soll.

    Außerdem hat Delphi 8 im Gegensatz zu jedem anderen beliebigen C#- oder VB.NET-Programm das Problem, dass die eigene Laufzeitbibliothek (Borland.delphi.dll) <b>nicht</b> zum .NET Framework gehört, so dass eine mit Delphi 8 kompilierte Assembly in <b>jedem</b> Fall einen "Fremdkörper" in sich trägt, der von .NET Security misstrauisch beäugt wird.

    Theoretisch gäbe es zwar die Möglichkeit, dass Microsoft auch automatisch allen Borland-Assemblies "blind vertraut", aber dieses Risiko werden die Microsofties niemals eingehen.

    Ein praktischer Versuch ist immer besser als jede Theorie:

    A) Delphi 7-Fassung
    <pre>
    <b>procedure</b> TForm1.Button1Click(Sender: TObject);
    <b>const</b>
    cITEMCOUNT = 500;
    <b>var</b>
    iStart : Integer;
    aLI : TListItem;
    iLoop : Integer;
    <b>begin</b>
    iStart := GetTickCount;
    ListView1.Items.BeginUpdate;
    <b>for</b> iLoop := 0 <b>to</b> cITEMCOUNT <b>do</b>
    <b>begin</b>
    aLI := ListView1.Items.Add;
    aLI.Caption := <font color="#9933CC">'Eintrag '</font> + IntToStr(iLoop);
    <b>end</b>;
    <b>for</b> iLoop := 0 <b>to</b> Pred(ListView1.Items.Count) <b>do</b>
    ListView1.Items[iLoop].Checked := True;
    <b>with</b> ListView1.Columns.Add <b>do</b>
    <b>begin</b>
    Caption := <font color="#9933CC">'Überschrift 1'</font>;
    Width := 100;
    <b>end</b>;
    ListView1.Items.EndUpdate;
    StatusBar1.SimpleText := IntToStr(GetTickCount - iStart);
    <b>end</b>;
    </pre>
    B) Delphi 8 VCL.NET-Fassung
    <pre>
    <b>procedure</b> TForm2.Button1Click(Sender: TObject);
    <b>const</b>
    cITEMCOUNT = 500;
    <b>var</b>
    iStart : Integer;
    aLI : TListItem;
    iLoop : Integer;
    <b>begin</b>
    iStart := GetTickCount;
    ListView1.Items.BeginUpdate;
    <b>for</b> iLoop := 0 <b>to</b> cITEMCOUNT <b>do</b>
    <b>begin</b>
    aLI := ListView1.Items.Add;
    aLI.Caption := <font color="#9933CC">'Eintrag '</font> + IntToStr(iLoop);
    <b>end</b>;
    <b>for</b> iLoop := 0 <b>to</b> Pred(ListView1.Items.Count) <b>do</b>
    ListView1.Items[iLoop].Checked := True;
    <b>with</b> ListView1.Columns.Add <b>do</b>
    <b>begin</b>
    Caption := <font color="#9933CC">'Überschrift 1'</font>;
    Width := 100;
    <b>end</b>;
    ListView1.Items.EndUpdate;
    StatusBar1.SimpleText := IntToStr(GetTickCount - iStart);
    <b>end</b>;
    </pre>
    C) Delphi 8 FCL-Fassung
    <pre>
    <b>procedure</b> TWinForm1.Button1_Click(sender: System.<b>Object</b>; e: System.EventArgs);
    <b>const</b>
    cITEMCOUNT = 500;
    <b>var</b>
    iStart : Integer;
    aLI : ListViewItem;
    iLoop : Integer;
    <b>begin</b>
    iStart := Environment.TickCount;
    ListView1.BeginUpdate;
    <b>for</b> iLoop := 0 <b>to</b> cITEMCOUNT <b>do</b>
    <b>begin</b>
    aLI := ListViewItem.Create(<font color="#9933CC">'Eintrag '</font> + iLoop.ToString);
    ListView1.Items.Add(aLI);
    <b>end</b>;
    <b>for</b> iLoop := 0 <b>to</b> Pred(ListView1.Items.Count) <b>do</b>
    ListView1.Items[iLoop].Checked := True;
    ListView1.Columns.Add(<font color="#9933CC">'Überschrift 1'</font>, 100, HorizontalAlignment.Center);
    ListView1.EndUpdate;
    StatusBar1.Text := Integer(Environment.TickCount - iStart).ToString;
    <b>end</b>;
    </pre>
    &#10

    Comment

    Working...
    X