Производительность ввода-вывода VBA - PullRequest
2 голосов
/ 09 ноября 2010

Я хотел бы знать, есть ли разница в производительности между этими двумя кодами:

Open strFile For Output As #fNum
For var1 = 1 to UBound(strvar1)
  For var2 = 1 to UBound(strvar2)
     For var3 = 1 to UBound(strvar3)
        For var4 = 1 to UBound(strvar4)
          Print #fNum texte
        Next var4
     Next var3
   Next var2
Next var1
Close #fNum

И

For var1 = 1 to UBound(strvar1)
  For var2 = 1 to UBound(strvar2)
     For var3 = 1 to UBound(strvar3)
        For var4 = 1 to UBound(strvar4)
          texteTotal = texteTotal  +  texte
        Next var4
     Next var3
   Next var2
Next var1

Open strFile For Output As #fNum
    Print #fNum texteTotal 
Close #fNum

В случае, если петли довольно большие?

Ответы [ 5 ]

3 голосов
/ 09 ноября 2010

Вам придется попробовать, потому что это зависит от размера texte.

Каждый раз, когда вы делаете texteTotal = texteTotal + texte, vba создает новую копию textTotal.По мере того как textTotal становится все больше и больше, ваш цикл замедляется.

Вы также рискуете создать строку больше, чем может обработать vba.

Итак:

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

Если вы записываете на быстрый локальный диск, а texte равен 64 КБ, а массивы составляют 1М записей каждый, первый подход будет лучше.

3 голосов
/ 10 ноября 2010

Поскольку вы сказали, что texte и texteTotal являются строками, у меня есть пара предложений:

1.Всегда объединяйте строки с помощью оператора & .

2.Помните, что конкатенация строк в VBScript имеет огромные накладные расходы и очень неэффективна.

0 голосов
/ 27 июля 2016

Недавно столкнулся с этой проблемой, когда я записывал большие объемы текста (~ 100 тыс. Строк) в сетевой файл. Поскольку каждая команда Print создает операции ввода-вывода, процесс записи файла был очень медленным. Однако создание большой строки путем объединения в нее новых строк также оказалось очень медленным, как объяснено в других ответах.

Я решил эту проблему, записав отдельные строки в буферный массив, затем соединив этот массив в строку, которая затем записывается в файл сразу. Исходя из вашего примера, это будет что-то вроде:

Dim buffer() as Variant
Dim i as Long
i = 1
ReDim buffer(1 to Ubound(strvar1) * Ubound(strvar2) * Ubound(strvar3) * Ubound(strvar4)
For var1 = 1 to UBound(strvar1) 
  For var2 = 1 to UBound(strvar2)
     For var3 = 1 to UBound(strvar3)
        For var4 = 1 to UBound(strvar4)
          buffer(i) = texte
          i = i + 1
        Next var4
     Next var3
   Next var2
Next var1
Open strFile For Output As #fNum
Print #fNum Join(buffer, vbCrLf)
Close #fNum

Это предотвращает как издержки инкрементных конкатенаций (функция Join масштабируется линейно с количеством строк вместо экспоненциальных, как это делает конкатенация), так и издержки ввода / вывода при записи многих строк индивидуально в сетевой файл. 1006 *

0 голосов
/ 10 ноября 2010

Коди Большое спасибо за ваше время.Вот еще немного информации: Пример кода № 1 - это текущий производственный код.Точнее, это одна часть всего процесса от

1) получения информации из БД # 1

2) вычисления с математическими формулами (матрицами, векторами), N = BIG

3) копировать результаты в текстовые файлы (10 тыс. Строк +) каждый.

4) запросы psql для вставки в базы данных

5) восстановление Мне интересно, действительно ли копирование в txt-файлы является действительно необходимым и дорогостоящим по сравнению с вставками psql?Мне нравится ваша идея создания пользовательского строкового класса, как вы думаете, он может превзойти производительность ввода-вывода?

0 голосов
/ 09 ноября 2010

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

Во втором случае я бы предположил, что он будет открыт в течение более короткого периода времени, , которыйлучше, так как вы должны блокировать ресурсы только на минимальный период времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...