FreeBasic
Главная
Вход
Регистрация
Суббота, 21.12.2024, 21:28Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 5
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Пожелания или дополнения к библиотеке
haavДата: Суббота, 22.12.2012, 23:19 | Сообщение # 1
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Пожелания или дополнения к библиотеке


В этой теме пишем любые пожелания\просьбы относящиеся к будующим возможностям библиотеки. Не обещаю, что все что будет написано, появится в библиотеке по простым причинам: я могу просто не знать как это делается, либо реализация очень сложная .
Так же если вы написали или нашли хорошую функцию , тоже можно сюда написать (единственно к функции желателен пример использования , хотя бы один).


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
ShadExДата: Суббота, 23.03.2013, 00:39 | Сообщение # 2
Лейтенант
Группа: Проверенные
Сообщений: 51
Репутация: 1
Статус: Offline
Привет, есть одно дополнение и одно пожелание.
Сначала дополнение, попросили меня тут давеча написать так называемую "качалку" файлов через 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 = ""

enc_tbeg = timer
to64 = Encode64(test_str)
enc_tend = timer
Print "Encode_TIME: " & enc_tend - enc_tbeg
Print "Encoded_STR: " &  Right(to64,45)
Print "Encoded_LEN: " &  Len(to64)
Print "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
dec_tbeg = timer
from64 = Decode64(to64)
dec_tend = timer
Print "Decode_TIME: " & dec_tend - dec_tbeg
Print "Decoded_STR: " & Right(from64,45)
Print "Decoded_LEN: " &  Len(from64)

Sleep

При ближайшем рассмотрении нашлись виновники - весь процес тормозится благодаря функциям 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 = ""

enc_tbeg = timer
to64 = enc_base64(test_str)
enc_tend = timer
Print "Encode_TIME: " & enc_tend - enc_tbeg
Print "Encoded_STR: " &  Right(to64,45)
Print "Encoded_LEN: " &  Len(to64)
Print "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
dec_tbeg = timer
from64 = dec_base64(to64)
dec_tend = timer
Print "Decode_TIME: " & dec_tend - dec_tbeg
Print "Decoded_STR: " & Right(from64,45)
Print "Decoded_LEN: " &  Len(from64)

Sleep

Я функцию декодирования не очень то пока сильно "грузил" тестами, но на мой взгляд там багов помойму нет. У меня кодирование отрабатывает за 0.10 секунд и декодирование - за 0.14.

Добавлено (23.03.2013, 00:39)
---------------------------------------------
Ну и просьба:
добавь пожалуйста функцию вспл. уведомления в трее(и желательно с иконками - NIIF_WARNING, NIIF_ERROR и.т.д), я бы и сам наверно справился, но ты уж слишком намудрил там, я раньше уже было пробовал там поменять кое-что и постоянно странные ошибки вываливались(из-за глобальных алиасов скорей всего)...


Сообщение отредактировал ShadEx - Суббота, 23.03.2013, 01:12
 
haavДата: Суббота, 23.03.2013, 10:08 | Сообщение # 3
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Цитата (ShadEx)
При ближайшем рассмотрении нашлись виновники - весь процес тормозится благодаря функциям 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


Или это только у меня?


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
ShadExДата: Суббота, 23.03.2013, 17:39 | Сообщение # 4
Лейтенант
Группа: Проверенные
Сообщений: 51
Репутация: 1
Статус: Offline
Нет, это не только у тебя, вот только для более наглядного результата наверно лучше увеличить входной буфер раз в пять:
Код
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)

Encode_TIME: 0.5029297
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Decode_TIME: 0.6176758


Передача по Byref:

Код
enc_base64(byref bs64 As String)
dec_base64(byref str_b64 as String)

Encode_TIME: 0.4951172
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Decode_TIME: 0.6201172


Передача по Byval:

Код
enc_base64(byval bs64 As String)
dec_base64(byval str_b64 as String)

Encode_TIME: 0.5214844
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Decode_TIME: 0.6850586


И вот тут я, как и ты, так же удивился, ведь при передаче параметров без явного указывания способа передачи по-умолчанию параметр должен передаваться через 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 smile


Цитата (haav)
Если в следующий раз появится желание что-либо добавить, создай тему, разберем что не получается.

Ок.
 
haavДата: Суббота, 23.03.2013, 18:13 | Сообщение # 5
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Ну значит убираем byval, раз так быстрее.

Цитата (ShadEx)
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.

surprised , кстати в VB6 насколько я понял все типы по умолчанию через byref. Зачем было авторам FB нарушать стандартизацию с декларациями, неверный на мой взгляд подход, только путаницу рождает.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
RoloverДата: Понедельник, 26.08.2013, 22:12 | Сообщение # 6
Лейтенант
Группа: Пользователи
Сообщений: 45
Репутация: 0
Статус: Offline
MySQL

а как на счет связаться с БД по сети )))) ну если учиться окошки создавать то и данные нужно откуда-то брать)))

А USB считывать???  про принтер молчу наверное же есть ))))


Объяснив другому, поймешь, что понял сам.
 
ShadExДата: Четверг, 29.08.2013, 21:00 | Сообщение # 7
Лейтенант
Группа: Проверенные
Сообщений: 51
Репутация: 1
Статус: Offline
Цитата (Rolover)
MySQLа как на счет связаться с БД по сети ))))

А нафига пихать обертку для MySQL в ориентированную на ГУЙ библиотеку?! Тем более, если она уже и так есть в станд. поставке с компилятором.


Цитата (Rolover)
А USB считывать???

Ууу, да легко!!! В хидерах ФриБейсика ведь есть оттраслированный DDK? Есть! Так что, как говориться - "флаг вам в руки" и "курить маны" до просветления, а начинать отсюда:
http://microsin.ru/content/view/1107/44/
http://microsin.ru/content/view/1108/44/
http://microsin.ru/content/view/1109/44/



Сообщение отредактировал ShadEx - Четверг, 29.08.2013, 21:01
 
haavДата: Четверг, 29.08.2013, 21:22 | Сообщение # 8
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Цитата (ShadEx)
- только вот засада, врапперы под libUSB есть даже под такие языки как Go, а под FB конечно же никто пока не успел написать, так что придется еще самому портировать сишные хидеры, заодно и на офф. форуме выложите


Вроде как есть: http://freebasic.net/forum/viewtopic.php?f=18&t=20820


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
ShadExДата: Пятница, 30.08.2013, 00:06 | Сообщение # 9
Лейтенант
Группа: Проверенные
Сообщений: 51
Репутация: 1
Статус: Offline
Цитата (haav)
Вроде как есть

Хм, тогда товарищу Rolover уже только подключить готовые надо будет, но курить АПИ библиотеки все равно придется. smile
Вообще, я так посмотрел - врапперы очень часто стали обновлять по сравнению с прошлыми версиями - курлу вон до 28-ой версии обновили... Теперь осталось только на 64-битные ОСи компилятор "допилить"... Интересно, до версии 1.0 "допилят"?
Ладно, кончаем оффтопить smile


Сообщение отредактировал ShadEx - Пятница, 30.08.2013, 00:07
 
javitelДата: Суббота, 12.10.2013, 03:07 | Сообщение # 10
Рядовой
Группа: Пользователи
Сообщений: 4
Репутация: 0
Статус: Offline
hi all, not Russian language and little English

by adding possible library about wlan wifi function

http://msdn.microsoft.com/en-us....29.aspx
 
haavДата: Суббота, 12.10.2013, 10:52 | Сообщение # 11
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Цитата javitel ()
hi all, not Russian language and little English

by adding possible library about wlan wifi function

http://msdn.microsoft.com/en-us....29.aspx


Thanks, I'll think about it.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
javitelДата: Суббота, 12.10.2013, 14:51 | Сообщение # 12
Рядовой
Группа: Пользователи
Сообщений: 4
Репутация: 0
Статус: Offline
Thanks, I would like to learn how to create functions
 
haavДата: Суббота, 12.10.2013, 19:36 | Сообщение # 13
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
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?


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
javitelДата: Суббота, 12.10.2013, 20:02 | Сообщение # 14
Рядовой
Группа: Пользователи
Сообщений: 4
Репутация: 0
Статус: Offline
I understand little about create functions dll based windows in fb
 
haavДата: Суббота, 12.10.2013, 20:33 | Сообщение # 15
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Цитата javitel ()
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.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
  • Страница 1 из 5
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Поиск: