1. Pascal / Говнокод #7977

    +102

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    const n = 50;
    type vec = array [1..n*4] of system.word;
    function vprod(const a, b: vec): Cardinal;
      var i: longInt;
      begin
        result := 0;
        for i := 1 to high(vec) do inc(result, a[i] * b[i]);
      end;
    function vprod_asm1(const a, b: vec): Cardinal; assembler;
      asm
         push ebx
         push ecx
         push edx
         push esi
         push edi
         xor ebx, ebx
         mov ecx, n*4
         mov esi, a
         mov edi, b
         xor eax, eax
         cld
      @@l:
         mov   ax, word ptr [esi]
         lea   esi, [esi+2]
         mul   word ptr [edi]
         lea   edi, [edi+2]
         shl   edx, 16
         mov   dx, ax
         add   ebx, edx
         dec   ecx
         jne   @@l
         mov   eax, ebx
         pop edi
         pop esi
         pop edx
         pop ecx
         pop ebx
      end;
    function vprod_asm2(const a, b: vec): Cardinal; assembler;
      asm
        push ebx
        push ecx
        push edx
        push esi
        push edi
        xor ebx, ebx
        mov ecx, n*4
        mov esi, a
        mov edi, b
        xor eax, eax
        cld
      @@l:
        lodsw
        movzx   edx, WORD PTR [edi]
        imul    edx
        lea     edi, [edi+2]
        add     ebx, eax
        loop  @@l
        mov   eax, ebx
        pop edi
        pop esi
        pop edx
        pop ecx
        pop ebx
      end;
    function vprod_mmx (const a, b: vec): Cardinal; assembler;
      var muls: record l, h: Cardinal end;
      asm
        push ebx
        push ecx
        push esi
        push edi
        mov ecx, n
        mov esi, a
        mov edi, b
        xor eax, eax
        lea     ebx, muls
      @@l:
        db $0F,$6F,$06  // movq    mm0, [esi]
        db $0F,$F5,$07  // pmaddwd mm0, [edi]
        lea     esi, [esi+8]
        db $0F,$7F,$03  // movq    [ebx], mm0
        lea     edi, [edi+8]
        add     eax, [ebx]
        add     eax, [ebx+4]
        loop    @@l
        db $0F,$77 // emms
        pop edi
        pop esi
        pop ecx
        pop ebx
      end;

    По просьбам трудящихся публикую модифицированную версию примера MMXTEST.PAS из комплекта компилятора TMT Pascal. Программа находит скалярное произведение двух векторов. Далее должен быть основной блок с фрагментами типа for i := 1 to 100000 do vprod(a, b); , которые я не стал публиковать ввиду ограничений. Функция vprod_asm1 — почти оригинальный код TMT, функция vprod_asm2 — мой оптимизированный вариант. Результаты запуска на двух машинах (таймер получал по RDTSC):
    AMD K6-2-333 МГц, FSB 66 МГц.

    Delphi7:
    Pascal = 0.550 sec.
    Asm x86 (original) = 1.034 sec.
    Asm x86 (optimized) = 0.490 sec.
    Asm MMX = 0.130 sec.
    С директивой $O- первый результат 0.853 sec.
    Замена loop на dec ecx + jne увеличивает результаты на 0,015 c.

    FPC:
    Pascal = 1.387 sec.
    Asm x86 (original) = 1.199 sec.
    Asm x86 (optimized) = 0.510 sec.
    Asm MMX = 0.124 sec.

    TMT:
    Pascal = 0.914 sec.
    Asm x86 (original) = 1.037 sec.
    Asm x86 (optimized) = 0.494 sec.
    Asm MMX = 0.126 sec.

    VP:
    Pascal = 0.520 sec.
    Asm x86 (original) = 1.033 sec.
    Asm x86 (optimized) = 0.493 sec.
    Asm MMX = 0.146 sec.
    С директивами $Q+,R+ первый результат 1.032 sec.
    С директивой $Speed- первый результат 0.731 sec.

    ------------------------------
    Celeron 1,86 ГГц, FSB 533 МГц.

    Delphi7:
    Pascal = 0.025 sec.
    Asm x86 (original) = 0.091 sec.
    Asm x86 (optimized) = 0.082 sec.
    Asm MMX = 0.044 sec.

    TMT:
    Pascal = 0.109 sec.
    Asm x86 (original) = 0.087 sec.
    Asm x86 (optimized) = 0.079 sec.
    Asm MMX = 0.042 sec.

    inkanus-gray, 25 Сентября 2011

    Комментарии (26)
  2. Pascal / Говнокод #7963

    +101

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    procedure TForm1.ShowPaletteButtonClick(Sender: TObject);
    begin
    if Form2.Visible = False then Form2.Visible := True;
    Form2.BringToFront;
    end;

    кстати о документации
    подлинное говно от багланд интернейшнл
    пруф - http://docwiki.embarcadero.com/CodeExamples/en/BringToFront_(Delphi)

    bugmenot, 24 Сентября 2011

    Комментарии (10)
  3. Pascal / Говнокод #7961

    +107

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    for i:=1 to 8 do
     begin
     case i of
     1 : begin
         xx := 0;
         yy := -LUCH_LEN;
         end;
     2 : begin
         xx := round(LUCH_LEN/sqrt(2));;
         yy := -round(LUCH_LEN/sqrt(2));;
         end;
     3 : begin
         xx := LUCH_LEN;
         yy := 0;
         end;
     4 : begin
         xx := round(LUCH_LEN/sqrt(2));;
         yy := round(LUCH_LEN/sqrt(2));;
         end;
     5 : begin
         xx := 0;
         yy := LUCH_LEN;
         end;
     6 : begin
         xx := -round(LUCH_LEN/sqrt(2));;
         yy := round(LUCH_LEN/sqrt(2));;
         end;
     7 : begin
         xx := -LUCH_LEN;
         yy := 0;
         end;
     8 : begin
         xx := -round(LUCH_LEN/sqrt(2));
         yy := -round(LUCH_LEN/sqrt(2));
         end;
     end;

    вот такое странное сочетание...

    dvdking, 23 Сентября 2011

    Комментарии (11)
  4. Pascal / Говнокод #7914

    +103

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    ...
    var count: integer;
          summ: integer;
    begin
     try
      case count of
        1: summ:=StrToInt(EditBox1.Text);
        2: summ:=StrToInt(EditBox1.Text)+StrToInt(EditBox2.Text);
        3: summ:=StrToInt(EditBox1.Text)+StrToInt(EditBox2.Text)+StrToInt(EditBox3.Text);
        4: summ:=StrToInt(EditBox1.Text)+StrToInt(EditBox2.Text)+StrToInt(EditBox3.Text)+StrToInt(EditBox4.Text);
        5: summ:=StrToInt(EditBox1.Text)+StrToInt(EditBox2.Text)+StrToInt(EditBox3.Text)+StrToInt(EditBox4.Text)+StrToInt(EditBox5.Text);
        6: summ:=StrToInt(EditBox1.Text)+StrToInt(EditBox2.Text)+StrToInt(EditBox3.Text)+StrToInt(EditBox4.Text)+StrToInt(EditBox5.Text)+StrToInt(EditBox6.Text);
        7: summ:=StrToInt(EditBox1.Text)+StrToInt(EditBox2.Text)+StrToInt(EditBox3.Text)+StrToInt(EditBox4.Text)+StrToInt(EditBox5.Text)+StrToInt(EditBox6.Text)++StrToInt(EditBox7.Text);
        8: summ:=StrToInt(EditBox1.Text)+StrToInt(EditBox2.Text)+StrToInt(EditBox3.Text)+StrToInt(EditBox4.Text)+StrToInt(EditBox5.Text)+StrToInt(EditBox6.Text)++StrToInt(EditBox7.Text)++StrToInt(EditBox8.Text);
        9: summ:=StrToInt(EditBox1.Text)+StrToInt(EditBox2.Text)+StrToInt(EditBox3.Text)+StrToInt(EditBox4.Text)+StrToInt(EditBox5.Text)+StrToInt(EditBox6.Text)++StrToInt(EditBox7.Text)++StrToInt(EditBox8.Text)+StrToInt(EditBox9.Text);
        10: summ:=StrToInt(EditBox1.Text)+StrToInt(EditBox2.Text)+StrToInt(EditBox3.Text)+StrToInt(EditBox4.Text)+StrToInt(EditBox5.Text)+StrToInt(EditBox6.Text)++StrToInt(EditBox7.Text)++StrToInt(EditBox8.Text)+StrToInt(EditBox9.Text)+StrToInt(EditBox9.Text);
        0: summ:= 0;
      end;
     except
       ShowMessage('Error');
     end;
    end;

    Сегодня увидал у однокурсника в универе.
    Самый оптимальные метод подсчета суммы элементов EditBox, не правдали???

    alexprey, 20 Сентября 2011

    Комментарии (8)
  5. Pascal / Говнокод #7896

    +112

    1. 1
    ТАЩИТЕ ЛЕСТНИЦУ!

    alexoy, 19 Сентября 2011

    Комментарии (57)
  6. Pascal / Говнокод #7869

    +146

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    var
      WS1, WS2, WS3: TWSocket;
    ...
    begin
    ...
    WS1 := TWSocket.Create(Self);
    WS2 := TWSocket.Create(Self);
    WS3 := TWSocket.Create(Self);
    ...
    end;

    и это гавно код

    Xxx_Guf_xxX, 14 Сентября 2011

    Комментарии (15)
  7. Pascal / Говнокод #7868

    +146

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    var
      WS: array[1..3] of TWSocket;
    ...
    var
      I: Integer;
    begin
    ...
      for I := 1 to 3 do
        WS := TWSocket.Create(Self);
    ...
    end;

    Гавно код так считают

    Xxx_Guf_xxX, 14 Сентября 2011

    Комментарии (17)
  8. Pascal / Говнокод #7838

    +98

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    for j:=k+1 to n+1 do
    	begin
    	r:=a[j,k]/a[k,k];
    	for i:=k to n do
                    begin
                    a[j,i]:=power(((a[j,i]-r*a[k,i]):a[i,j]),a[j,i]);
                    end;

    К сожалению, я уже забыл, какой идентификатор что значит :(
    Придется переписывать.

    Lioncure, 12 Сентября 2011

    Комментарии (23)
  9. Pascal / Говнокод #7817

    +90

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    Procedure TfMain.CheckButtonsStatus;
    begin
      // Если есть кто-то в персональной очереди, то возобновить активна
      if (dMain.PersonalQueueQuery.RecordCount > 0) then
        TImageButton(mButtons[6]).mlabel.Enabled := true
      else
        TImageButton(mButtons[6]).mlabel.Enabled := False;
    
      // 'приглашен', 3, 'оповещен', 4, 'оповещен', 5, 'прием начат')
      if (dMain.StateQuery.FieldValues['state'] = 'свободно') then
      begin
        TImageButton(mButtons[0]).mlabel.Enabled := False;
        TImageButton(mButtons[1]).mlabel.Enabled := False;
        if dMain.CommonQueueQuery.RecordCount > 0 then
          TImageButton(mButtons[2]).mlabel.Enabled := true
        else
          TImageButton(mButtons[2]).mlabel.Enabled := False;
    
        TImageButton(mButtons[3]).mlabel.Enabled := False;
        TImageButton(mButtons[4]).mlabel.Enabled := False;
        TImageButton(mButtons[5]).mlabel.Enabled := False;
        OperPopupMenu.Items[0].Enabled := False;
      end;
    
      if (dMain.StateQuery.FieldValues['state'] = 'приглашен') or
        (dMain.StateQuery.FieldValues['state'] = 'оповещен') then
      begin
        TImageButton(mButtons[0]).mlabel.Enabled := true;
        TImageButton(mButtons[1]).mlabel.Enabled := False;
        TImageButton(mButtons[2]).mlabel.Enabled := False;
        TImageButton(mButtons[3]).mlabel.Enabled := true;
        TImageButton(mButtons[4]).mlabel.Enabled := False;
        TImageButton(mButtons[5]).mlabel.Enabled := False;
        TImageButton(mButtons[6]).mlabel.Enabled := False;
        if (dMain.StateQuery.FieldValues['state'] = 'приглашен') then
          OperPopupMenu.Items[0].Enabled := False
        else
          OperPopupMenu.Items[0].Enabled := true;
      end;
    
      if (dMain.StateQuery.FieldValues['state'] = 'прием начат') then
      begin
        TImageButton(mButtons[0]).mlabel.Enabled := False;
        TImageButton(mButtons[1]).mlabel.Enabled := true;
        TImageButton(mButtons[2]).mlabel.Enabled := False;
        TImageButton(mButtons[3]).mlabel.Enabled := False;
        TImageButton(mButtons[4]).mlabel.Enabled := true;
        TImageButton(mButtons[5]).mlabel.Enabled := true;
        TImageButton(mButtons[6]).mlabel.Enabled := False;
        OperPopupMenu.Items[0].Enabled := False;
      end;
    end;

    На работе достался проект, состоящий чуть менее чем полностью из подобных высеров.

    chaoswithin, 09 Сентября 2011

    Комментарии (37)
  10. Pascal / Говнокод #7783

    +101

    1. 1
    2. 2
    3. 3
    i := -7; // если после этой строчки загнать в отладчик i shr 1, то отладчик покажет -4
    i := i shr 1; // после этой строчки i становится равно 2147483644
    i := (-7) shr 1; // после этой строчки i становится равно 4

    Delphi7 такой Delphi7...

    http://www.gamedev.ru/code/forum/?id=138759&page=25#m367
    Тарас любит дельфи.

    CPPGovno, 06 Сентября 2011

    Комментарии (150)