Здравствуйте, VladD2, Вы писали:
PD>>Не надо мне сто раз повторять, я все это давно понял.
VD>Да, вот со стороны не заметно.
Жаль
PD>> Еще раз объясняю, что я хочу узнать, на твоем языке . Объект мертв (в твоем смысле, т.е.исчезла последняя ссылка). Но память, отведенная под него, еще не освобождена GC. Он это сделает потом.
VD>Ну, я же гворю нихрена не понял.
VD>Неосвобождается никакая память никогда. В принципе! VD>Память считается свободной стазу как объект умер. Просто хип получае фракментированным и ЖЦ требуется произвести вычисление графа живых объектов, чтобы перенести их в другой хип, сдвинуть в этом (если это второе поколение). И только в LOH он занимается отметкой блоков которые "освободились".
Это ты меня не понял!
Я же не говорю об освобождении памяти моим кодом. Я имею в виду освобождение памяти в куче,которое производит GC. Да, память считается свободной стазу как объект умер. Но для того, чтобы ее повтороно можно было кому-то отдать, GC ее должен освободиь (пометить, если хочешь, укомпачить и т.д) или нет ? Я об этом говорю, а не о том, что я сам delete вызову
PD>> А пока что я новые объекты создаю. Их в эту память (занятую мерьвым объектом) поместить нельзя, т.к. GC его еще не убрал. Вот это меня и смущает. Если я успею насоздавать быстрее, чем он успеет мертвые объекты похоронить, то память будет расти, и, может быть, весьма сильно.
VD>Знашь, я устал повтоярь. По этому скажу последний раз. Все очень просто. Большие объекты никто не занимает тоннами в цикле.
Да ? ИМХО в вычислительных задачах такое не так уж редко случается. Создают и пересоздают матрицы и т.д. Сам с такими задачами имел дело.
PD>>Ничего. Кроме тог, что запуск следующего приложения или переключение на другое растянутся надолго.
VD>Это твои догадки не имеющие ничего общего с действительносью, так как и свопинг происходит в таких условиях довольно шутстро
Сто раз я слышал про шустрый свопинг. А реально если страницы помечены как модифицированные, то их мимоходом в этот своп-файл и перепишут. Хотя реально эти LOH страницы содержат память, которую я давно потерял (умерли объекты). и она вообще никому не нужна.
VD>1. Это рассуждения про десктоп системы. В серверных приложениях все несколько иначе.
Рад слышать, что хоть с десктопом ты согласен
VD>2. Один хрен визуально никаких тормозов не наблюдается. Можешь провести эксперемент. Возми любое дотнетное (а можно и нет) приложение отожравшее много (по-твоему) памяти и минимизируй его. Увидишь, что его ворксет сильно сократится, хотя никаких тормозов ты не заметишь.
Где его взять ?
PD>>Я думаю, на эту тему дискутировать не стоит — только флейм получится. Кому нравится арбуз, а кому свиной хрящик
VD>А что здесь разговаривать то? Компиляция 8 проектов С++ с общим объемом исходников 3.5 метра занимала у нас 15 минут на довольно современной технике. И это на одном из самых быстрых компиляторов — VC. На Intel C++ это вообще вылевалось в часы. Сегодня Янус с практически тем же объемом исходников на C# (а они точно компактнее плюсовых) компилируется за 2 секунды!
Я тоже устал повторять. Время компиляции меня абсолютно не волнует. Меня только скорость работы программы интересует.
VD>А тебе нравится, что в С++ виртуальный объект тоже черт знает что хранит?
Что это он такое хранит ? Формат vtable мне известен, а больше он ничего не хранит. Множественное наследование я не рассматриваю — это действительно неудачная идея.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Я же не говорю об освобождении памяти моим кодом. Я имею в виду освобождение памяти в куче,которое производит GC. Да, память считается свободной стазу как объект умер. Но для того, чтобы ее повтороно можно было кому-то отдать, GC ее должен освободиь (пометить, если хочешь, укомпачить и т.д) или нет ? Я об этом говорю, а не о том, что я сам delete вызову
Дык размер хипов нулевого и первого поколения фиксированный. Он конечно может расти при некоторых условиях, но если он просто переполнен, то производится сборка мусора. Так что можно говорить только фрагментации кучи и сборке мусора с целью ее устранения. А понятия "объект умер" связано только с потерей ссылок на него. Ты же ведь из того что в хипе есть фрагментация хочешь какие-то выводы сделать? А? Какие?
PD>Да ? ИМХО в вычислительных задачах такое не так уж редко случается. Создают и пересоздают матрицы и т.д. Сам с такими задачами имел дело.
И часто матрицы на 1000 элементов создют? И если создают, то тоннами? Ничего что их умножение квадратичный алгоритм?
PD>Сто раз я слышал про шустрый свопинг. А реально если страницы помечены как модифицированные, то их мимоходом в этот своп-файл и перепишут. Хотя реально эти LOH страницы содержат память, которую я давно потерял (умерли объекты). и она вообще никому не нужна.
Однократное переписывание процесс очень быстрый. Проблемы со свопингом начинаются когда в системе нехватает памяти, а память бурно используется в разных процессах. Тогда начинается борьба за физическую память и ее начинают отнимать не только у давно не используемых кусков, а у бурно используемый. В итоге начинается постоянная подкачка, т.п. работа не на оперативке, а на винте. Вот это вызывает тормоза, а сброс ворксета — секундное дело.
VD>>2. Один хрен визуально никаких тормозов не наблюдается. Можешь провести эксперемент. Возми любое дотнетное (а можно и нет) приложение отожравшее много (по-твоему) памяти и минимизируй его. Увидишь, что его ворксет сильно сократится, хотя никаких тормозов ты не заметишь.
PD>Где его взять ?
Например, запусти VS.
PD>Я тоже устал повторять. Время компиляции меня абсолютно не волнует. Меня только скорость работы программы интересует.
А меня очень валнует. А программы у меня работают довольно шустро. И там где можно было бы по шустрее почему-то все упирается не в проблемы дотнета, а в нэйтив-код. Например, Янус. В нем если тормоза и начинаются, то постоянно они связаны с Джетом, а он, как известно, как раз на супер пупер С/С++ написан.
VD>>А тебе нравится, что в С++ виртуальный объект тоже черт знает что хранит?
PD>Что это он такое хранит ? Формат vtable мне известен,
Ну, это не совсем прада. Вернее совсем не правда. В общем случае формат vtbl недокументирован. Тебе известна его реализация на некоторых компиляторах. И то думаю, ты знаком с ней в очень примитивном виде. Множественное наследование приводит к тамик выкрутасам, что трудно описать. Срасти ПК. Он тебе расскажет.
PD> а больше он ничего не хранит. Множественное наследование я не рассматриваю — это действительно неудачная идея.
А что же его не рассматривать то если оно есть? И из-за этого нельзя сделать 4-х или 8-ми байтные указатели на методы. Народ извращается по страшному.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Задача абсолютно банальная. На WinAPI я в своей работе текстовый файл в 150 Мбайт (такой заказчик дал) открывал (сделал memory-mapped файл) и издевался над ним как хотел. Сначала в нем \n\r на нули заменил и сразу все строки в ASCIIZ получил, потом массив указателей на строки соорудил, потом внутри строк пробелы на нули заменил (парсил, так сказать , а потом сортировал эти указатели, получив таким образом файл, отсортированный по ряду критериев — одни массив указателей был отсортирован по первому слову строки, другой по второму и т.д. И при все этом ни одного байта из этого файла не скопировал куда бы то ни было. А тут что угодно предлагают, и, похоже, без хорошего решения.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Pavel Dvorkin, Вы писали:
VD>Дык размер хипов нулевого и первого поколения фиксированный. Он конечно может расти при некоторых условиях, но если он просто переполнен, то производится сборка мусора. Так что можно говорить только фрагментации кучи и сборке мусора с целью ее устранения. А понятия "объект умер" связано только с потерей ссылок на него. Ты же ведь из того что в хипе есть фрагментация хочешь какие-то выводы сделать? А? Какие?
Неувереннось в том, что размер хипа все же не будет расти в случае LOH.
PD>>Да ? ИМХО в вычислительных задачах такое не так уж редко случается. Создают и пересоздают матрицы и т.д. Сам с такими задачами имел дело.
VD>И часто матрицы на 1000 элементов создют? И если создают, то тоннами? Ничего что их умножение квадратичный алгоритм?
Я все же не пойму, почему ты так упорно утверждаешь, что это квадратичный алгоритм. Он от роду был кубическим. А на вопрос о создании/уничтожении матриц ответ прост — создают. В вычислительных задачах — создают.
VD>Однократное переписывание процесс очень быстрый. Проблемы со свопингом начинаются когда в системе нехватает памяти, а память бурно используется в разных процессах. Тогда начинается борьба за физическую память и ее начинают отнимать не только у давно не используемых кусков, а у бурно используемый. В итоге начинается постоянная подкачка, т.п. работа не на оперативке, а на винте. Вот это вызывает тормоза, а сброс ворксета — секундное дело.
Секундное дело ? OK, давай подсчитаем. Предположим, там 1024 страницы по 4 Кб. Всего 4 Мб. И вот их надо сбросить, например. За секунду, пожалуй, 4 Мб записать удастся.
А если не 1024, а в 10 раз больше (а у меня было 57 Мб). Тут уже на десятки секунд дело пойдет. А страницы эти никому не нужны, так как все объекты в них умерли.
VD>Например, запусти VS.
Запустил. Кстати, о VS. Вот такой маленький вопросик. Почему до сих пор многие используют VS6 — для С++, конечно ? И среда в VS удобнее, и компилятор лучше, и стандарт С++ точнее соблюдается, а пишут ведь на VS6! У меня VS6 на машине тоже стоит, летает буквально. А VS7 — медленнее, увы.
Кстати, когда VS6 появился, про VS5 все очень быстро забыли.
VD>А меня очень валнует. А программы у меня работают довольно шустро. И там где можно было бы по шустрее почему-то все упирается не в проблемы дотнета, а в нэйтив-код. Например, Янус. В нем если тормоза и начинаются, то постоянно они связаны с Джетом, а он, как известно, как раз на супер пупер С/С++ написан.
Не знаю насчет Януса,но вот RSDN в последнее время тормозит очень сильно. Не из-за aspx ли ?
VD>>>А тебе нравится, что в С++ виртуальный объект тоже черт знает что хранит?
PD>>Что это он такое хранит ? Формат vtable мне известен,
VD>Ну, это не совсем прада. Вернее совсем не правда. В общем случае формат vtbl недокументирован. Тебе известна его реализация на некоторых компиляторах.
Ну не надо такое хоть говорить. В формате _stdcall он основой COM является, т.е. двоичным стандартом для Windows. Хоть на VC++, хоть BCB++, хоть Delphi...
>И то думаю, ты знаком с ней в очень примитивном виде. Множественное наследование приводит к тамик выкрутасам, что трудно описать.
Знаю. Но я же сказал — за вычетом мн. наследования, которое не есть удачная идея. А что там творится — я еще на BC 3.1 в свое время изучал и плевался.
>Срасти ПК. Он тебе расскажет.
??? Не понял.
PD>> а больше он ничего не хранит. Множественное наследование я не рассматриваю — это действительно неудачная идея.
VD>А что же его не рассматривать то если оно есть?
А то, что никто не заставляет им пользоваться. Я без него вполне обхожусь. Мало ли что где есть. На ассемблере команда AAA есть, ты ей часто пользовался ?
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Запустил. Кстати, о VS. Вот такой маленький вопросик. Почему до сих пор многие используют VS6 — для С++, конечно ? И среда в VS удобнее, и компилятор лучше, и стандарт С++ точнее соблюдается, а пишут ведь на VS6! У меня VS6 на машине тоже стоит, летает буквально. А VS7 — медленнее, увы. PD>Кстати, когда VS6 появился, про VS5 все очень быстро забыли.
У меня модули остались под VC6 потому что в семерке библиотеки сильно переписали. Много несовместимостей в STL и MFC. Переводить на VC7, пока времени нет. А больше причин нет.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Неувереннось в том, что размер хипа все же не будет расти в случае LOH.
Как паказывает практике не растет.
PD>Я все же не пойму, почему ты так упорно утверждаешь, что это квадратичный алгоритм. Он от роду был кубическим. А на вопрос о создании/уничтожении матриц ответ прост — создают. В вычислительных задачах — создают.
Потому что в нем 3 (!) вложенных цикла.
PD>Секундное дело ? OK, давай подсчитаем. Предположим, там 1024 страницы по 4 Кб. Всего 4 Мб. И вот их надо сбросить, например. За секунду, пожалуй, 4 Мб записать удастся. PD>А если не 1024, а в 10 раз больше (а у меня было 57 Мб). Тут уже на десятки секунд дело пойдет. А страницы эти никому не нужны, так как все объекты в них умерли.
Вот, провел следственных эксперемент:
using System;
using System.IO;
class Program
{
static void Main()
{
DateTime start = DateTime.Now;
byte[] array = new byte[100 * 1024 * 1024];
const string path = @"C:\temp\test.tmp";
File.WriteAllBytes(path, array);
Console.WriteLine("Время записи 100 метров составило: "
+ (DateTime.Now - start));
if (File.Exists(path))
File.Delete(path);
else
Console.WriteLine("Файл не был создан");
}
}
Надеюсь объяснять этот код не нужно? Чай не С++ с ВыньАПИ...
Так вот на моей машине он показал:
Время записи 100 метров составило: 00:00:01.4372322
А 100 метровый LOH — это даже в огромных серверных прилоежениях большая редкость. У нас
PD>Запустил. Кстати, о VS. Вот такой маленький вопросик. Почему до сих пор многие используют VS6 — для С++, конечно ? И среда в VS удобнее, и компилятор лучше, и стандарт С++ точнее соблюдается, а пишут ведь на VS6!
Спроси этих людей. Я таких ровно двоих знаю. Ты один из них.
PD>У меня VS6 на машине тоже стоит, летает буквально. А VS7 — медленнее, увы. PD>Кстати, когда VS6 появился, про VS5 все очень быстро забыли.
А между тем VS5 в те времена была значительно быстрее. Особенно хэлп. В 6-ке он стал отдельным МСДН-ом, а в 5-е был встроенным и очень быстрым.
Подумай над этим. Может дело в том, что каждый продукт пишется под конкретное железо, а твое на данном этапе отсало? У меня, напрмер, VS2005, которая к слову значительно более медленная чем VB2003, загружается пару секунд. Меня это более чем устраивает. Загружаю по 2-3 копии чтобы просто провести эксперемент. Кстати, для шарповских проектов появилась потрясающая опция. Теперь можно создавать временные проекты, как в Дельфи. Попробовал идею... закрыл студию... и файлы автоматом грохнулись. Спосает от сотен ненужных проектов. А если нужно записал... И это только мелкое улучшение. А если вспомнить рефакторинг и т.п., то про такие дремучие вещи как VS5-6 и вспоминать то не хочется.
PD>Не знаю насчет Януса,но вот RSDN в последнее время тормозит очень сильно. Не из-за aspx ли ?
До MSDM входящего в состав VS2005 (которая выйдет только 7 ноября) в MSDM дотнета небыло. Но крипись. Хотя по скорости разницы лично я не наблюдаю.
VD>>Ну, это не совсем прада. Вернее совсем не правда. В общем случае формат vtbl недокументирован. Тебе известна его реализация на некоторых компиляторах.
PD>Ну не надо такое хоть говорить. В формате _stdcall он основой COM является, т.е. двоичным стандартом для Windows. Хоть на VC++, хоть BCB++, хоть Delphi...
stdcall — это не стандартный тип вызова. К vtbl отношения не имеющий. А говорю я то что есть. Например, на Сановских компиляторах vtbl вообще нет. Там все совсем подругому устроено, но тем не менее КОМ-у это не мешает.
PD>Знаю. Но я же сказал — за вычетом мн. наследования, которое не есть удачная идея. А что там творится — я еще на BC 3.1 в свое время изучал и плевался.
>>Срасти ПК. Он тебе расскажет.
PD>??? Не понял.
У Павел Кузнецов. Он этот вопрос знает как свои 5 пальцев.
PD>А то, что никто не заставляет им пользоваться.
Да? А как при этом, скажем, пользоваться ATL или бустом?
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Пора ИМХО кончать эту дискуссию. Все равно строны остаются в основном при своем. Так что только 2 маленьких замечания
PD>>Я все же не пойму, почему ты так упорно утверждаешь, что это квадратичный алгоритм. Он от роду был кубическим. А на вопрос о создании/уничтожении матриц ответ прост — создают. В вычислительных задачах — создают.
VD>Потому что в нем 3 (!) вложенных цикла.
Так 3 вложенных цикла и означает кубический
n=10 10*10*10 = 1000
n=20 20*20*20 = 8000
n увеличилось в 2 раза, число операций — в 8. Это и есть куб.
PD>>Запустил. Кстати, о VS. Вот такой маленький вопросик. Почему до сих пор многие используют VS6 — для С++, конечно ? И среда в VS удобнее, и компилятор лучше, и стандарт С++ точнее соблюдается, а пишут ведь на VS6!
VD>Спроси этих людей. Я таких ровно двоих знаю. Ты один из них.
2004 там пра веток. За этот год вообще ничего нет кроме аннотации древней книги. Да и запросы нужно уметь писать. А то твой находит все умоминания студии, а не только 6-ки.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>>Запустил. Кстати, о VS. Вот такой маленький вопросик. Почему до сих пор многие используют VS6 — для С++, конечно ? И среда в VS удобнее, и компилятор лучше, и стандарт С++ точнее соблюдается, а пишут ведь на VS6!
Я пишу свои проекты (не на работе, хотя и на работе тоже пара есть) под средой 6-й вижуалки, компилю Intel C++ 9 который и лучше микрософтовского по генерируемому коду, особенно в отношении оптимизации под SSE2 и соответствует стандарту. А почему мне не нравится 7-я? Тормознее, падает (у меня по крайней мере, даже под свежепоставленной виндой) частенько, Эти выплывающие dockable окошки достали. Одно в 7-й нравится — сворачивалка кода (ну, плюсики слева от редактора — чтоб кусок кода свернуть). Вот кто б подсказал как такое под VS6 замутить — был бы крайне признателен.
Самое смешное... запустил я тут тест сишарпный на своей машине(ну, ту программку, с которой топик начался). Результат поразительный — микросекунды.
Т.е. практически мгновенно. Шо такое?
Вот текст программки на всякий пожарный, вдруг я чего не так понял.
ОС Windows 2003, P4 2.8 Ghz, 1024Mb Ram
using System;
using System.Threading;
namespace Matrix
{
/// <summary>
/// Summary description for Class1.
/// </summary>class Class1
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
float[][] a, b, c;
int i,j,k,nSize = 10;
float temp;
DateTime nTimeStart = DateTime.Now;
a = new float[nSize][];
for( i = 0; i < nSize; i++)
a[i] = new float[nSize];
for(i = 0; i < nSize; i++)
for(j = 0; j < nSize; j++)
a[i][j] = 1;
b = new float[nSize][];
for( i = 0; i < nSize; i++)
b[i] = new float[nSize];
for(i = 0; i < nSize; i++)
for(j = 0; j < nSize; j++)
b[i][j] = 1;
c = new float[nSize][];
for( i = 0; i < nSize; i++)
c[i] = new float[nSize];
for(i = 0; i < nSize; i++)
{
for(j = 0; j < nSize; j++)
{
temp = 0;
for( k = 0; k < nSize; k++)
temp += a[i][k] * b[k][j];
c[i][j] = temp;
}
}
TimeSpan nTimeEnd = DateTime.Now-nTimeStart;
Console.WriteLine("Time = {0}", nTimeEnd.Milliseconds);
for(i=0;i<nSize;i++)
{
for(j=0;j<nSize;j++)
Console.Write("{0} ",c[i][j]);
Console.WriteLine();
}
//
// TODO: Add code to start application here
//
}
}
}
Здравствуйте, Codechanger, Вы писали:
C>Самое смешное... запустил я тут тест сишарпный на своей машине(ну, ту программку, с которой топик начался). Результат поразительный — микросекунды. C>Т.е. практически мгновенно. Шо такое?
Странный вопрос. Ну вроде умножение двух матриц 10x10 много времени и не отнимет
Здравствуйте, Mab, Вы писали:
Mab>Здравствуйте, Codechanger, Вы писали:
C>>Самое смешное... запустил я тут тест сишарпный на своей машине(ну, ту программку, с которой топик начался). Результат поразительный — микросекунды. C>>Т.е. практически мгновенно. Шо такое? Mab>Странный вопрос. Ну вроде умножение двух матриц 10x10 много времени и не отнимет
Здравствуйте, Codechanger, Вы писали: C>См. первые сообщения в теме)))
И что? В первом сообщении в C++ коде n = 1000, в C# n = 10. Вероятно, Павел забыл вернуть n нормальное значение и осталось маленькое тестовое.
Здравствуйте, Mab, Вы писали:
Mab>Здравствуйте, Codechanger, Вы писали: C>>См. первые сообщения в теме))) Mab>И что? В первом сообщении в C++ коде n = 1000, в C# n = 10. Вероятно, Павел забыл вернуть n нормальное значение и осталось маленькое тестовое.
Точно... очепятка...Вот теперь висит так висит
Здравствуйте, Mab, Вы писали:
Mab>Здравствуйте, Codechanger, Вы писали: C>>См. первые сообщения в теме))) Mab>И что? В первом сообщении в C++ коде n = 1000, в C# n = 10. Вероятно, Павел забыл вернуть n нормальное значение и осталось маленькое тестовое.
Я уж думал топик это давно в историю ушел. Ан нет.
Все именно так. Когда я это тестировал, мне показалось , что C# программа зависла. Я решил проверить и поставил 10 вместо 1000. А потом скопировал в сообщение, не посмотрев