steinkrauz

> Recent Entries
> Archive
> Friends
> User Info

April 20th, 2022


11:09 pm - c# command line parser
Писал, значится я себе соксопрокси, и чтобы не заморачиваться с файлом конфигурации, решил все настройки делать через командную строку. Тупым перебором с кучей сравнений или хитрым свитчем делать это было не интересно, да и бинарный сериалайзер я только что написал... В общем, эта хрень работает через рефлексию. Зато практически никакого запутанного кода, и минимум писанины для конечного пользователя.

А потому, поддавшись тлетворному влиянию эльфийских товарищей, всё это дело я оформил в отдельную библиотеку, точнее просто файлик с исходниками, которой можно тупо добавить в свой проект и использовать. Что оно умеет:
  • короткую и длинную форму для параметра
  • целые, дробные и строковые значения для параметров
  • обязательность параметра
  • параметр-флаг
  • автоматическая генерация справки


В принципе, базовые потребности закрывает, для чего-то более извращённого лучше использовать более сложные вещи.

Смотреть тут

https://github.com/steinkrauz/StkCli

(30 comments | Leave a comment)

March 17th, 2014


07:15 pm - Стук головой о стенку
Ну запретите уже им

for (int i = 0; i < status.NumberUnloadedDocs; i++) {
    if  (status.GetStatus(i) == 641044) {
        //Console.WriteLine("Doc.open(): {0} {1} {2} {3}", i, status.GetStatus(i), status.GetDocName(i), status.GetStatusDescription(i));
        // не найден файл
    } else if (status.GetStatus(i) == 641044) {
        dsSession.warnings.Add(String.Format("Doc.open(): {0} {1} {2} {3}", i, status.GetStatus(i), status.GetDocName(i), status.GetStatusDescription(i)));
    } else {
        dsSession.errors.Add(String.Format("Doc.open(): {0} {1} {2} {3}", i, status.GetStatus(i), status.GetDocName(i), status.GetStatusDescription(i)));
    }
}

(Leave a comment)

April 23rd, 2013


09:50 am - .NET garbage collector
A basic overview
http://blogs.telerik.com/justteam/posts/13-04-02/understanding-net-garbage-collection

(Leave a comment)

January 9th, 2013


01:58 pm - .NET JIT wonders
Once upon a time there was a difference between 'for' and 'foreach': http://www.codeproject.com/Articles/6759/FOREACH-Vs-FOR-C
Well, the article is now 8 years old, and instead of ugly and clumsy .NET 1.1 we have .NET 4.0 with tons of useful features and handfuls of sweet syntax sugar. But had anything change under the hood? Let us repeat the test from the article.
Here is the C# code:
    class Program {
        static void testFor() {
            int[] myInterger = new int[1];
            int total = 0;
            for (int i = 0; i < myInterger.Length; i++) {
                total += myInterger[i];
            }
        }

        static void testForeach() {

            int[] myInterger = new int[1];
            int total = 0;
            foreach (int i in myInterger) {
                total += i;
            }
        }

        static void Main(string[] args) {
            testFor();
            testForeach();
        }
    }
}


OK, following the original article the next step is to disassemble actual binary code created by JIT compiler.
This one is for 'for'
; Function ForForeach.Program.testFor (code starts at 0x2700a0).
; Offsets are relative to function start.

push        ebp
mov         ebp,esp
mov         edx,1
mov         ecx,6B4F4186h
call        FFF52103
mov         ecx,eax
xor         edx,edx
mov         eax,dword ptr [ecx+4]
test        eax,eax
jle         0000000B
cmp         dword ptr [ecx+edx*4+8],eax
inc         edx
cmp         eax,edx
jg          FFFFFFF9
pop         ebp
ret

And this is 'foreach'
; Function ForForeach.Program.testForeach (code starts at 0x2700e0).
; Offsets are relative to function start.

push        ebp
mov         ebp,esp
mov         edx,1
mov         ecx,6B4F4186h
call        FFF520C3
mov         ecx,eax
xor         edx,edx
mov         eax,dword ptr [ecx+4]
test        eax,eax
jle         0000000B
cmp         dword ptr [ecx+edx*4+8],eax
inc         edx
cmp         eax,edx
jg          FFFFFFF9
pop         ebp
ret


Judging from this huge difference in the disassembled samples I'm able to say that Microsoft had definitely introduced some improvements in the most recent versions on .NET framework and, therefore, the article I've mentioned in the beginning is no longer relevant.

(7 comments | Leave a comment)

August 31st, 2011


12:46 am - Мелкоглюк
На днях, разбираясь с утилитой, обнаружил, что её очень тормозит вывод сообщений в консоль. Там в цикле (как оказалось потом, по 3.5Е6 элементам) на каждой итерации писалось "номер такой-то загружен" и возврат каретки. Не, я знал, что вывод в консоль тормозит, но не ожидал, что настолько.
Поначалу я грешил на добавленный в семёрке пятое колесо conhost.exe, позволяющий хомячкам натягивать свои уютненькие темки на консольное окно. Но, как показала практика, Колумб почти не виноват.
Чтобы не быть голословным, я смоделировал свою проблему, обвязал бенчмаркой и запустил разных средах.
Ну чо, под семёркой разница во времени исполнения между наличием и отсутствием вывода в консоль составила 300 раз.
Соответственно, под XP эта разница упала аж до 250 раз. То есть, похоже, несчастный conhost, таки добавляет тормозов в консоль, но на фоне двух порядков разницы эта добавка не так уж и важна.
Ну и контрольная проверка на линухе: разница составляет 3 (прописью: три) раза. Правда, на линухе стоит простенький WindowMaker, и для полноты правильности надо бы проверить на линуховой машине с няшненьким полупрозрачным терминальчиком.

А дальше я решил посмотреть, как поведут себя разные языки в разных средах.

OS
C
C++
C#
Win7
130
300 (23)
200 (0,67)
Win8
130
N/A
180 (0,86)
WinXP
170
250 (12)
150 (0,75)
Interix
4
10 (23)
200 (23)
Linux
3
3 (8)
110 (103)


Цифры в скобках — это отношение времени вывода в консоль на данном языке к выводу на С.
UPD:Цифры без скобок — это отношение времени выполнения с выводом в консоль к времени выполнения без вывода.
UPD2: Добавил данных по Win8 (15.09.11)

(5 comments | Leave a comment)

February 22nd, 2011


03:25 pm - Внезапно Java
Продолжил свои дурацкие сравнения строковой производительности.
Совершенно неожиданно на первое место вылезла Java (1.6.0_14), в 1.3 раза обогнав .NET

Доберусь домой — проверю, что выходит под W7/64 и Линуксом

Добрался. Картина не поменялась.
Под Линуксом С++ всё же чуть быстрее, чем Java (1.6.0_24-b07), но не принципиально, в 1.1 раза.
Под W7/64 Java(1.6.0_23-b05) в 1.25 раза быстрее .Net 4.0 и в 1.5 раза быстрее С++

(Leave a comment)


> Go to Top
LJ.Rossia.org