|
April 20th, 2022
11:09 pm - c# command line parser Писал, значится я себе соксопрокси, и чтобы не заморачиваться с файлом конфигурации, решил все настройки делать через командную строку. Тупым перебором с кучей сравнений или хитрым свитчем делать это было не интересно, да и бинарный сериалайзер я только что написал... В общем, эта хрень работает через рефлексию. Зато практически никакого запутанного кода, и минимум писанины для конечного пользователя.
А потому, поддавшись тлетворному влиянию эльфийских товарищей, всё это дело я оформил в отдельную библиотеку, точнее просто файлик с исходниками, которой можно тупо добавить в свой проект и использовать. Что оно умеет:
- короткую и длинную форму для параметра
- целые, дробные и строковые значения для параметров
- обязательность параметра
- параметр-флаг
- автоматическая генерация справки
В принципе, базовые потребности закрывает, для чего-то более извращённого лучше использовать более сложные вещи.
Смотреть тут
https://github.com/steinkrauz/StkCli
|
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)));
}
}
|
April 23rd, 2013
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.
|
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)
|
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 раза быстрее С++
|
|
|