В этой теме пишем любые пожелания\просьбы относящиеся к будующим возможностям библиотеки. Не обещаю, что все что будет написано, появится в библиотеке по простым причинам: я могу просто не знать как это делается, либо реализация очень сложная . Так же если вы написали или нашли хорошую функцию , тоже можно сюда написать (единственно к функции желателен пример использования , хотя бы один). Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
Привет, есть одно дополнение и одно пожелание. Сначала дополнение, попросили меня тут давеча написать так называемую "качалку" файлов через gmail, ну а там, как тебе наверно известно, аттачи в письмах кодируются в base64. Ну задачка то плевая - выпарсить и раскодировать в буфер, тем более что тип String как раз подходит для бинарного буфера, но тут "всплыл" один "косячок". Функция Decode64 на больших обьемах отрабатывает в среднем раз в 70(!!!) медленнее чем Encode64, хотя они должны быть приблизительно эквивалентны по производительности...
Короче вот код:
Код
Dim As String test_str = String(16777216,"a")
Dim As Single enc_tbeg, enc_tend Dim As Single dec_tbeg, dec_tend Dim As String to64 = "" Dim As String from64 = ""
При ближайшем рассмотрении нашлись виновники - весь процес тормозится благодаря функциям Mid, InStr и Chr. Ну с первыми двумя картина понятна, но вот почему Chr такая медленная - вот это для меня загадка... Возможно потому, что ей можно сразу неопределенное кол-во параметров передать?
Добавлено (23.03.2013, 00:23) --------------------------------------------- Вообщем, так как переписывать Chr в сорцах ФБ никто не будет, то пришлось искать альтернативы. Я сначала потратил впустую время на перевод Сишного исходника, но там вышло еще хуже, а потом наткнулся на функции декодирования из библиотеки EXT, но они там перегружены и со своими типами, так что пришлось их также переписать взяв оттуда только принцип смещения и таблицу с массивом. Так как после тестирования функция dec_base64 стала обрабатывать почти в два раза быстрее, хотя входной буффер там больше, то пришлось "слепить" в одно целое также и оригинальную Encode64(всетаки вызов функций намного медленней, чем прямая обработка). Короче, предлагаю заменить их в твоей библиотеке на этот исходник:
Код
' encoder by Joshy (D.J.Peters) Function enc_base64(ByRef bs64 As String) As String export Dim as Integer j,k=0 Dim as Integer l=len(bs64) if l=0 then return "" dim as string arr64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" & _ "abcdefghijklmnopqrstuvwxyz" & _ "0123456789+/" Dim as string t64
t64 = String(((l+2)\3)*4,"=") For j = 0 To l - ((l Mod 3)+1) Step 3 t64[k+0] = arr64[(bs64[j+0] shr 2)] t64[k+1] = arr64[(((bs64[j+0] and 3) shl 4) + (bs64[j+1] shr 4))] t64[k+2] = arr64[(((bs64[j+1] and &H0F) shl 2) + (bs64[j+2] shr 6))] t64[k+3] = arr64[(bs64[j+2] and &H3F)] k += 4 Next If (l mod 3) = 2 Then t64[k+0] = arr64[(bs64[j+0] shr 2)] t64[k+1] = arr64[(((bs64[j+0] and 3) shl 4) + (bs64[j+1] shr 4))] t64[k+2] = arr64[(((bs64[j+1] and &H0F) shl 2) + (bs64[j+2] shr 6))] t64[k+3]=61 ElseIf (l mod 3) = 1 Then t64[k+0] = arr64[(bs64[j+0] shr 2)] t64[k+1] = arr64[((((bs64[j+0] and 3) shl 4) + (bs64[j+1] shr 4)))] t64[k+2]=61 t64[k+3]=61 End If return t64 End Function
' decoder from EXT lib function dec_base64(byval str_b64 as const String) As String export Dim As Integer sb64_len = Len(str_b64) If sb64_len < 4 Then Return "" Dim out_Str As String = String(((sb64_len \ 4) * 3), !"\0") static _decode_tbl(255) as ubyte => { _ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, _ ' 0..31 0,0,0,0,0,0,0,0,0,0,0, _ ' 32..42 62,0,0,0,63, _ ' 43 (+), 44..46, 47 (/) 52,53,54,55,56,57,58,59,60,61, _ ' 48..57 (0..9) 0,0,0,0,0,0,0, _ ' 58..64 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25, _ ' 65..90 (A..Z) 0,0,0,0,0,0, _ ' 91..96 26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,_ ' 97..122 (a..z) 0,0,0,0,0 } ' 123..127
Dim out_blen As Integer = 0 for ctr64 as Integer = 0 to sb64_len - 1 Step 4 dim as uinteger buf = (_decode_tbl(str_b64[ctr64+0]) shl 18) or _ (_decode_tbl(str_b64[ctr64+1]) shl 12) or _ (_decode_tbl(str_b64[ctr64+2]) shl 6) or _ (_decode_tbl(str_b64[ctr64+3])) If str_b64[ctr64+2] = 61 And str_b64[ctr64+3] = 61 Then out_Str[out_blen+0] = buf shr 16 out_blen += 1 Exit for ElseIf str_b64[ctr64+2] <> 61 And str_b64[ctr64+3] = 61 Then out_Str[out_blen+0] = buf shr 16 out_Str[out_blen+1] = (buf shr 8) and &hFF out_blen += 2 Exit for EndIf out_Str[out_blen+0] = buf shr 16 out_Str[out_blen+1] += (buf shr 8) and &hFF out_Str[out_blen+2] += buf and &hFF out_blen += 3 Next Return Left(out_Str,out_blen) end Function
'================= TEST BASE64 ==================================
Dim As String test_str = String(16777216,"a")
Dim As Single enc_tbeg, enc_tend Dim As Single dec_tbeg, dec_tend Dim As String to64 = "" Dim As String from64 = ""
Я функцию декодирования не очень то пока сильно "грузил" тестами, но на мой взгляд там багов помойму нет. У меня кодирование отрабатывает за 0.10 секунд и декодирование - за 0.14.
Добавлено (23.03.2013, 00:39) --------------------------------------------- Ну и просьба: добавь пожалуйста функцию вспл. уведомления в трее(и желательно с иконками - NIIF_WARNING, NIIF_ERROR и.т.д), я бы и сам наверно справился, но ты уж слишком намудрил там, я раньше уже было пробовал там поменять кое-что и постоянно странные ошибки вываливались(из-за глобальных алиасов скорей всего)...
Сообщение отредактировал ShadEx - Суббота, 23.03.2013, 01:12
При ближайшем рассмотрении нашлись виновники - весь процес тормозится благодаря функциям Mid, InStr и Chr.
Насчет mid и instr не знаю (не было проблем), но chr точно медленная. Я уже не раз заменял ее конструкцией Union.
Цитата (ShadEx)
Короче, предлагаю заменить их в твоей библиотеке на этот исходник:
Потестировал на паре примеров, багов не заметил. Работает очень шустро. Спасибо за помощь. Заменю.
Цитата (ShadEx)
добавь пожалуйста функцию вспл. уведомления в трее(и желательно с иконками - NIIF_WARNING, NIIF_ERROR и.т.д)
Хорошая идея, нужно реализовать.
Цитата (ShadEx)
я бы и сам наверно справился, но ты уж слишком намудрил там, я раньше уже было пробовал там поменять кое-что и постоянно странные ошибки вываливались(из-за глобальных алиасов скорей всего)...
Если в следующий раз появится желание что-либо добавить, создай тему, разберем что не получается.
Кстати, если не сложно, не мог бы проверить скорость на своем компе. У меня при таком использовании быстрее:
Код
function dec_base64(str_b64 as String) As String export
чем при таком:
Код
function dec_base64(byval str_b64 as const String) As String export
Или это только у меня? Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
Нет, это не только у тебя, вот только для более наглядного результата наверно лучше увеличить входной буфер раз в пять:
Код
Dim As String test_str = String(83886080,"a")
Судя по результатам тестов передача параметра типа Const String практически не отличается от передачи просто String. А вот с Byval и Byref тесты действительно немного различаются -
Передача без обьявления:
Код
enc_base64(bs64 As Const String) dec_base64(str_b64 as Const String)
И вот тут я, как и ты, так же удивился, ведь при передаче параметров без явного указывания способа передачи по-умолчанию параметр должен передаваться через byval же, правильно? Но полазив в мануале понял, что у разработчиков свои соображения на этот счёт, вот цитата из раздела "Statements > Procedures > Declaration > Function":
Цитата
In the -lang fb dialect, ByVal is the default parameter passing convention for all built-in types except String; String and user-defined Types are passed ByRef by default.
Вот так вот... А если хочешь узнать, почему в функции декодирования определена передача через byval, то причина очень проста - при копировании таблицы-массива из исходников EXT я также "зацепил" и строку начала функции, а исправить byval на byref забыл, но зато теперь буду помнить про особенность передачи в функцию по-умолчанию переменных с типом String
Цитата (haav)
Если в следующий раз появится желание что-либо добавить, создай тему, разберем что не получается.
In the -lang fb dialect, ByVal is the default parameter passing convention for all built-in types except String; String and user-defined Types are passed ByRef by default.
, кстати в VB6 насколько я понял все типы по умолчанию через byref. Зачем было авторам FB нарушать стандартизацию с декларациями, неверный на мой взгляд подход, только путаницу рождает. Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
А нафига пихать обертку для MySQL в ориентированную на ГУЙ библиотеку?! Тем более, если она уже и так есть в станд. поставке с компилятором.
Ведь если бы не лень-матушка, то товарищ Rolover мог бы уже давно пошарить в "\[ПАПКА-С-ФРИБЕЙСИКОМ]\examples\libraries\DB\" и найти там простой пример поключения к базе MySQL (пример не будет работать без ДЛЛ'ок), а потом еще чуть подумав и пошарив по пути подключения хедера "mysql\mysql.bi" ("\[ПАПКА-С-ФРИБЕЙСИКОМ]\inc\mysql\") он мог бы легко найти обьявление функции соединения с мускульным сервером:
declare function mysql_real_connect alias "mysql_real_connect" ( _ byval mysql as MYSQL ptr, _ ' указатель на инициализацию либы мускула byval host as zstring ptr, _ ' имя хоста или айпишник для соединения ' (по умолчанию NULL - коннект будет к "localhost" или к ip "127.0.0.1") byval user as zstring ptr, _ ' строка логина byval passwd as zstring ptr, _ ' строка пароля byval db as zstring ptr, _ ' имя базы данных ' (по умолчанию NULL, но потом нужно будет выбрать имя базы) byval port as uinteger, _ ' порт для соединения (в большинстве случаев - константа MYSQL_PORT(3306) ) byval unix_socket as zstring ptr, _ ' это походу для никсовых систем алиас сокета (по умолчанию NULL) byval clientflag as uinteger _ ' флаги опций подключения (по умолчанию 0) ) as MYSQL ptr
А если еще немного соображалки подключить, то можно просто поменять NULL ("localhost") на строку с именем удаленного хоста или айпишника сервера, ну и если порт другой, то заодно и сменить номер порта.
Хотя если серьезно, и в случае, если устройство класса HID, то можно много и не "курить", так как для HID есть стандартный драйвер, и читать/писать в порт можно, как в файл: http://microsin.ru/content/view/613/44/
- только вот засада, врапперы под libUSB есть даже под такие языки как Go, а под FB конечно же никто пока не успел написать, так что придется еще самому портировать сишные хидеры, заодно и на офф. форуме выложите
Ну, а в случае, когда у устройства присутствует также драйвер виртуального COM-порта, то здесь уже даже стандартными средствами Фрибейсика можно обойтись.
Сообщение отредактировал ShadEx - Четверг, 29.08.2013, 21:01
- только вот засада, врапперы под libUSB есть даже под такие языки как Go, а под FB конечно же никто пока не успел написать, так что придется еще самому портировать сишные хидеры, заодно и на офф. форуме выложите
Хм, тогда товарищу Rolover уже только подключить готовые надо будет, но курить АПИ библиотеки все равно придется. Вообще, я так посмотрел - врапперы очень часто стали обновлять по сравнению с прошлыми версиями - курлу вон до 28-ой версии обновили... Теперь осталось только на 64-битные ОСи компилятор "допилить"... Интересно, до версии 1.0 "допилят"? Ладно, кончаем оффтопить
Сообщение отредактировал ShadEx - Пятница, 30.08.2013, 00:07
Thanks, I'll think about it. Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
In what sense? You do not know how to create a function? Or just want to learn how to add your functions to the library? Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
I understand little about create functions dll based windows in fb
In this case, write the function, trying to post on the forum. If they are useful, they will go to the library showing you as the author. But because of one or two functions, I will not update the library. If you accumulate a dozen, will be released update. Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…