Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

использование string

292
10 марта 2006 года
Matush
726 / / 14.01.2004
string str = "";

for(int t=0; t<10000/*так к примеру*/; t++)
{
str += "Какой-то текст";
}

вот, данная система начинает очень медленно работать при достижении str определенного размера.
Как быть в такой ситуации?

Сейчас решил проблему так: создаю массив переменных типа string и в этом же цикле тусую в каждую стрингу по пару-десять записей - производительность возросла в сотни раз.

Может можно как иначе?
1.9K
10 марта 2006 года
mail0
137 / / 09.05.2005
Цитата:
Originally posted by Matush
string str = "";

for(int t=0; t<10000/*так к примеру*/; t++)
{
str += "Какой-то текст";
}

вот, данная система начинает очень медленно работать при достижении str определенного размера.
Как быть в такой ситуации?

Сейчас решил проблему так: создаю массив переменных типа string и в этом же цикле тусую в каждую стрингу по пару-десять записей - производительность возросла в сотни раз.

Может можно как иначе?

Попробуй StringBuilder.

273
11 марта 2006 года
3A3-968M
1.2K / / 22.12.2005
Можно метод Append из StringBuilder, для увеличения скорости можно воспользоваться массивом символов фиксированного размера. В твоём варианте львиную долю производительности забирает сборщик мусора, так как ему приходится удалять предыдущую копию строки в цикле.
8.2K
11 марта 2006 года
Track
44 / / 30.05.2005
Цитата:
Originally posted by 3A3-968M
Можно метод Append из StringBuilder, для увеличения скорости можно воспользоваться массивом символов фиксированного размера. В твоём варианте львиную долю производительности забирает сборщик мусора, так как ему приходится удалять предыдущую копию строки в цикле.



Ну, сборщик мусора-то запустится только тогда, когда память закончится, а вот выделение каждый раз памяти под новый объект и копирование данных из старого места в новое очень сильно на себя тянет ресурсов.

Вообще, StringBuilder начинает делать простую конкатенацию строк вроде начиная приблизительно с 50000 операций (кто-то там тестил). До этого они по производитеьности приблизительно одинаковы.

А как пользоваться массивом символов?

273
11 марта 2006 года
3A3-968M
1.2K / / 22.12.2005
Сборщик мусора уничтожает объекты, когда:
1) На текущий объект не установлено ни одной активной ссылки;
2) При выходе из области видимости (например, возврат управления из функции);
3) Банальный конец памяти;
Для подтверждения этих слов можно открыть журнал MSDN Magazine за май 2005 на странице 11.
292
12 марта 2006 года
Matush
726 / / 14.01.2004
Цитата:
Originally posted by mail0
Попробуй StringBuilder.


Спасибо, помогло !!!

8.2K
13 марта 2006 года
Track
44 / / 30.05.2005
Цитата:
Originally posted by 3A3-968M
Сборщик мусора уничтожает объекты, когда:
1) На текущий объект не установлено ни одной активной ссылки;
2) При выходе из области видимости (например, возврат управления из функции);
3) Банальный конец памяти;
Для подтверждения этих слов можно открыть журнал MSDN Magazine за май 2005 на странице 11.



Это да, но условия 1) не достаточно для моментального включения сборщика мусора. Т.е. он не включается для при появлении нового объекта, на который нет активных ссылок. Процедура сборки мусора включает в себя фрагментацию кучи, поэтому он работает не так часто, как кажется, т.к. вся процедура - ресурсоемкая штука. А вот выполнение одновременно условий 1) и 3) достаточно для включения сборщика.

Условие 2), как я понял или равно 1) или в случае value-type объектов происходит очистка стека уже без сборщика.

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

273
13 марта 2006 года
3A3-968M
1.2K / / 22.12.2005
Сборщик мусора вызвается при:
1) Вызове Finalize
2) Вызове IDisposable.Dispose
3) Вызове GC.Collect
4) MSIL-инструкцией POP
Куча делится на GC Heap, где размещаются объекты малого размера и LOH (Large Object Heap) для объектов>85000 байт. Вот LOH не уплотняется при локальном сборе, а GC Heap уплотняется. Под уплотнение отводятся определённые кванты времени и условия. Например, сборщик мусора вызывается при переключения контекста (при передаче управления потоку или процессу). К глобальному сбору относится (перемещение объекто в LOH) выгрузка домена приложения и банальная нехватка памяти. Сборщик мусора не отвечает за установку активных ссылок. За это отвечает сам экземпляр, информацию об этом можно получить из TypeHandle и EECLass этого экземпляра. Поэтому ресурсов для уплотнения GC Heap много не надо и сборка в GC Heap произойдёт при наличии пассивных ссылок в момент переключения контекста.
А существует ещё один способ сборки: При JIT-клмпиляции компилятор может узнать, в каком месте кода происходит последнее использование объекта. Пример:
object o=new object();
int x=6;
object[] b=new object[2];
b[0]=o;
b=null;
JIT-компилятор определяет место удаления экземпляра o так:
объекта. Пример:
1)
object o=new object();
o.Finalize();//
int x=6;
object[] b=new object[2];
b[0]=o; //экземпляр o ещё используется,
//переносим Finalize сюда
b=null;
2)
object o=new object();
o.Finalize();//
int x=6;
object[] b=new object[2];
b[0]=o;
b=null; //в b содержится ссылка на o
3)
object o=new object();
o.Finalize();//
int x=6;
object[] b=new object[2];
b[0]=o;
b=null;
o.Finalize();
Таким образом на этапе JIT компиляции определяется места для вызова сборки мусора
8.2K
14 марта 2006 года
Track
44 / / 30.05.2005
Цитата:
Originally posted by 3A3-968M
Сборщик мусора вызвается при:
1) Вызове Finalize



Это не так, легко проверяется. Обычно Finalize используется для удаления неуправляемых ресурсов.

Больше спорить не буду ;), т.к. про LOH, к сожалению, ничего не знаю.

273
15 марта 2006 года
3A3-968M
1.2K / / 22.12.2005
Freeman, ты зря так! Никто ни у кого не сдирал! Сборка мусора существовала ещё до Delphi в Java, потом в Visual Basic. Сборка мусора характерна для всех скриптовых языков и для сред выполнения, которые используют машинно-независимый байт-код (Java и .NET). Тем более что в Delphi есть только ручная сборка мусора, а не автоматическая, как в Java или Visual Basic. В дэльфе ресурсы нужно очищать деструкторами, иначе память закончится.
492
16 марта 2006 года
alibabaich
238 / / 08.07.2004
Цитата:
Originally posted by Freeman
Я к тому, что это борладовская реализация, даже названия методов те же.

Совпадения сигнатур и алгоритмов,не означает совпадение реализаций.

Код:
//Сигнатура
public void main()
//Реализация
{
    int a=5,b=6,c;
    c = a;
    a = b;
    b = c;
}
//Сигнатура
public void exchenge(int a, int b)
//Реализация
{
    int c = a;
    a = b;
    b = c;
}
//Сигнатура
public void main()
//Реализация
{
    int a=5,b=6;
    exchenge(a,b);
}

//алгоритм
Дано: а,б
вводим временную переменную с
с:=а
а:=б
б:=с
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог