PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Нагрузочность строковых операций - опыт исследования


Нагрузочность строковых операций - опыт исследования

Сообщений 1 страница 3 из 3

1

Понадобилось форматировать число по триадам для улучшения читаемости.
В хелпе не нашел ничего подходящего.
Сделал функцию с несколько расширенными возможностями
Procedure.s IntToTrain(In.q, FieldLen.i, delimiter.s) ; Входное число, длина поля ("триады"), разделитель триад

Причем для эксперимента сделал два варианта - со сороковыми операциями и без них (на CopyMemory)
так вот 10 млн. цикл с 12-ти значным десятичным числом
для первого варианта занял 26 сек, для второго - 16 сек.
для числа из 1 знака - оба варианта ~8сек

Код
Код:
Procedure.s IntToTrain(In.q, FieldLen.i, delimiter.s) ; Входное число, длина поля ("триады"), разделитель триад
  tmp$=Str(In)
  tmpLen=Len(tmp$)
  ; количество "триад"
  FieldQty=Int(tmpLen/FieldLen): If (tmpLen % FieldLen)>0: FieldQty+1: EndIf
	
  result$=""
  p=tmpLen+1
  For i=1 To FieldQty
    p-FieldLen
    If p<1
      If FieldQty>1
        result$=Left(tmp$,FieldLen+p-1)+delimiter+result$
      Else
        result$=Left(tmp$,FieldLen+p-1)
      EndIf
    Else
      If i=1
        result$=Mid(tmp$,p,FieldLen) ;+delimiter+result$
      Else
        result$=Mid(tmp$,p,FieldLen)+delimiter+result$
      EndIf
    EndIf
  Next
  ProcedureReturn result$
EndProcedure

Procedure.s IntToTrain2(In.q, FieldLen.i, delimiter.s) ; Входное число, длина поля ("триады"), разделитель триад
  tmp$=Str(In)
  tmpLen=Len(tmp$)
  dlmLen=Len(delimiter)
  NewLen=0
  ; количество "триад" и новая длина
  FieldQty=Int(tmpLen/FieldLen)
  NewLen=FieldQty*FieldLen
  n=tmpLen % FieldLen
  If n>0
    FieldQty+1
    NewLen+n
  EndIf
  NewLen+(FieldQty-1)*dlmLen

  *Result=AllocateMemory(NewLen+1)
  FillMemory(*Result, NewLen+1)
  pr=0 ;pointer of result
  If n>0 ; перенос первой неполной триады
    CopyMemory(@tmp$, *Result, n)
    pr+n
    If FieldQty>1
      CopyMemory(@delimiter, *Result+pr, dlmLen)
      pr+dlmLen
    EndIf
  EndIf
	
  p=n+1 
    While p<tmpLen ; перенос полных триад
      CopyMemory(@tmp$+p-1, *Result+pr, FieldLen)
      pr+FieldLen
      If pr<NewLen
        CopyMemory(@delimiter, *Result+pr, dlmLen)
        pr+dlmLen    	
      EndIf
      p+FieldLen
    Wend
  ProcedureReturn PeekS(*Result , NewLen )

EndProcedure

А все потому что первый вариант на каждую триаду выполняет такую операцию
result$=Mid(tmp$,p,FieldLen)+delimiter+result$

а второй такую
CopyMemory(@tmp$+p-1, *Result+pr, FieldLen)
CopyMemory(@delimiter, *Result+pr, dlmLen)

0

2

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

0

3

Пётр написал(а):

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

К этому и стремился сочиняя второй алгоритм.

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Нагрузочность строковых операций - опыт исследования