Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Есть ли смысл переводить на ASM? или хватит C++? Добавлено: 30.11.05 09:05  

Автор вопроса:  Comanche
Есть VB-шный код по выкладке двумерного массива в буфер обмена в формате HTML (в виде таблицы). Я и так уже отказался от бэйсиковской конкатенации строк, задействовав класс cAllocMem от sne. Но всё равно на больших объёмах данных скорость меня не устраивает.

Вопрос: имеет ли смысл переводить код на ASM, или же ограничиться переводом на C++? и ещё: переводя на C++, стоит ли конкатенировать строки тем же макаром (а ля sne), или же вполне будет достаточно и встроенных возможностей Си?

Вот, кстати, код:

  ' Стартовый фрагмент:
  sStart = "<HTML><HEAD><STYLE>TD {mso-number-format:'\@';}</STYLE></HEAD><BODY><TABLE style=border-collapse:collapse>"
  
  ' Конкатенацию выполняем при помощи класса cAllocMem (на порядок быстрее, чем средствами VB!):
  Set a = New cAllocMem
  For i = LBound(vArr, 2) To UBound(vArr, 2)
    a.WriteString "<TR>"
    For j = 0 To UBound(sFieldNames)
      a.WriteString "<TD>"
      a.WriteString IIf(IsNull(vArr(j, i)), "", vArr(j, i))
      a.WriteString "</TD>"
    Next
    a.WriteString "</TR>"
  Next
  sFrag = a.ReadString(0, a.Size) ' << результат конкатенации
  
  ' Конечный фрагмент:
  sEnd = "</TABLE></BODY></HTML>"
  
  a.Clear           ' << чистимся
  Set a = Nothing   ' << --- " ---
  
  PutHTMLClipboard sFrag, sStart, sEnd ' << используем процедуру от Майкрософта (http://support.microsoft.com/kb/274326/en-us)


Примечания:
1. Код PutHTMLClipboard здесь не привожу - вполне может быть, что её можно будет оставить как есть, т.е. на VB6; основное торможение - на циклах с конкатенацией, что и хоцца ускорить.
2. Код класса cAllocMem есть, по-моему, в "Примерах" или же в "Библиотеке кодов". Так что тоже не привожу. Вероятно, это ограничит список вступивших в дискуссию только уважаемым sne :))
3. Предвижу комментарий: "да тут ASM - это из пушки по воробьям!". Вполне может быть! потому и спрашиваю! Просто требования к скорости - очень критичные!

Ответить

  Ответы Всего ответов: 3  

Номер ответа: 1
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #1 Добавлено: 30.11.05 09:07
2 Павел:
Если апостроф идёт внутри строки (т.е. внутри двойных кавычек), то его не нужно расценивать как знак начала комментария!!!

Ответить

Номер ответа: 2
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #2
Добавлено: 30.11.05 18:55
Хз, что юзает класс, но выделение VirtualAlloc'ом большого куска памяти должно тебе помочь. В твоем случае PAGEFAULT будет вызываться только в зависимости от длины готовой строки, т.е. будет наверняка быстрее, чем HeapAlloc.

Ответить

Номер ответа: 3
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #3 Добавлено: 30.11.05 20:26
Что там в cAllocMem действительно хз, можно предположить, что используется паскалевское представление строки, что значительно ускоряет работу с ней. Если скорость так критична, можешь реализовать этот класс на си, уйдя от си-строк и используя паскальные строки. И не стоит доводить дело до исключений, можно контролировать длину строки, чтобы она вписывалась в выделенную память. А лишние ACCESS_VIOLATION - это огромный тормоз.
Либо если уверен, что сможешь оптимизировать лучше, чем cl.exe, то пиши на асме :)
Сделать лучше, чем имеется, можно всегда, какой бы невыполнимой задача не казалась.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам