Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Скорость выполнения процедуры в потоке

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

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
procedure TTCPThread.FindFiles(StartFolder, Mask: string;
  ScanSubFolders: Boolean = True);
var
  SearchRec: TSearchRec;
  FindResult: Integer;
  ZipArchive: TZipFile;
begin
    ZipArchive:=TZipFile.Create;
    ZipArchive.Open(StartFolder+'tmp\'+OutFileName+OutFileMask,zmWrite);
  try
    StartFolder := IncludeTrailingBackslash(StartFolder);
    if FindFirst(StartFolder + '*.*', faAnyFile, SearchRec) = 0 then
    try
    repeat
          if (SearchRec.Attr and faDirectory) <> 0 then
          begin
      if   ScanSubFolders and (SearchRec.Name <> '.')
           and (SearchRec.Name <> '..') then
      FindFiles(StartFolder + SearchRec.Name, Mask, ScanSubFolders);
          end
          else
          begin
          if MatchesMask(SearchRec.Name, Mask) then
          ZipArchive.Add(StartFolder+SearchRec.Name);
          end;
    until FindNext(SearchRec) <> 0;
    finally
          FindClose(SearchRec);
    end;
  finally
    ZipArchive.Close;
    FreeAndNil(ZipArchive);
  end;
Ответ:
Сообщение от arman4587
нужно в потоке увеличить скорость
Поток сам по себе не имеет ничего общего ни с "увеличением" ни "уменьшением" "скорости".
Вопрос: Скорость выполнения delete

Всем привет!
Интересует почему скорость выполнения деструктора зависит нелинейно от объёма структуры? Есть у меня бинарное дерево глубиной ~15(это 65535 узлов) и это же дерево глубиной 18(524287). В первом случае деструктор выполняется за 874 мс, во втором 27264 мс.
Код C++
1
2
3
4
5
6
7
8
9
10
11
~Binary_Space_Partitioning() { clear(head); head = NULL; }
 
void Binary_Space_Partitioning::clear(bsp_node *node)
{
    if(node != NULL)
    {
        clear(node->left);
        clear(node->right);
        delete node;
    }
}
Почему операции delete занимают так много времени в случае второго дерева? На его создание уходит значительно меньше времени(на порядок). В случае же глубины 15 время создание даже чуть больше - 1280. Могу предположить, что дело во фрагментации, хотя всё равно непонятно почему выделяет память быстрее, чем освобождает.

В общем меня такие объёмы данных пока не интересуют, но как можно решить такую проблему?
Ответ: В общем более менее разобрался в чём дело. Попробовал релиз версию(непосредственно из папки) - скорость значительно быстрее - примерно столько же сколько в debug, но без освобождения памяти. В debug режиме винда накладывает ограничения на компилятор и при освобождение памяти он ещё проверяет на целостность освобождаемые блоки и только потом помечает их как освобожденные. А ещё освобожденные, смежные блоки объединяет. Естественно при большой фрагментации это всё будет занимать не мало времени.
Вопрос: Разница во времени выполнения запроса к MySQL

Доброго времени!

Пишу PHP-скрипт в Дэнвере. Никак не получается добится требуемой скорострельности. Обратил внимание вот на что:

Пишу в скрипте, например, такой код:

PHPHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    $dblink = @mysqli_connect($dbhost, $dbuser, $dbpasswd, $dbname) OR message_die(@mysql_errno(), @mysql_error(), __FILE__, __LINE__);
 
    @mysqli_query($dblink, "SET character_set_database=utf8");
    @mysqli_query($dblink, "SET NAMES utf8");
 
    $sql = "SELECT DISTINCT n.`id` AS id, n.`name` AS name, n.`num` AS num FROM `prs_5gramms` AS g, `prs_normal` AS n WHERE g.`code` IN (11302, 361664, 11573248, 1245185, 6291500, 1414, 45259, 1448306, 12791361, 6670382, 12125637, 18921649, 1512992, 14861312) AND n.`id` = g.`id` AND num >= 11 AND num <= 23";

    $tm = microtime(1);

    $similars = mysqli_query($dblink, $sql);

    $tm = microtime(1) - $tm;

    printf("Total Time: %f<br/>", $tm);
 
    @mysqli_free_result($similars) OR message_die(@mysql_errno(), @mysql_error(), __FILE__, __LINE__);
 
    @mysqli_close($dbcnx) OR message_die(@mysql_errno(), @mysql_error(), __FILE__, __LINE__);
Вызываю этот скрипт из браузера.
Результат времени выполнения вызова mysqli_query - 0,7-0,8 секунды. Очень и очень много.

Задаю тот же самый SQL-запрос в phpMyAdmin. Время выполнения - около 0,005 секунды. Это уже хорошо.

Чем вызвана такая гигантская разница? Кто виноват? PHP? Дэнвер? Я?

Пробовал на разных машинах на разных версиях Дэнвера. Использовал библиотеки mysql и mysqli - результат одинаковый.

Но ведь phpMyAdmin тоже какой-то API использует. Возможно, что тот же самый. Откуда тогда такая разница? Можно ли как-то добиться, чтобы время вызова функции из скрипта было соразмерно с временем выполнения запроса?
Ответ: Да, всё верно: не обратил внимания, что там не 1-2 страницы получается, а более сотни. А если выводить последнюю страницу, то время как раз и будет все те же 0,7-0,8 секунды.

Проблема в безграмотном запросе. Опция DISTINCT применяется к объединенному результату сцепления таблиц n и g. Т.е. сначала делается выборка из g с включением всевозможных дублей. Потом она объединяется с n. И только потом прореживается.

Попытался сделать недублирующую выборку из g вложенным запросом. Результат был ужасен. Вместо того, чтобы сначала получить недублирующую выборку из g и связать ее по индексу с n, MySQL стал просматривать ВСЮ таблицу n и для каждой итерации выполнять свою выборку из g.

Попытался подойти с другой стороны:

SQL
1
2
3
4
5
6
7
EXPLAIN SELECT n.`id` AS id, n.`name` AS name, n.`num` AS num
FROM (SELECT DISTINCT `id` FROM `prs_5gramms`
WHERE `code` IN (11302, 361664, 11573248, 1245185, 6291500, 1414, 45259, 1448306, 12791361, 6670382, 12125637, 18921649, 1512992, 14861312)
) AS g
INNER JOIN `prs_normal` AS n
USING (`id`)
WHERE `num` >= 11 AND `num` <= 23
Этот запрос работает раза в 3-4 быстрее, но все равно через ж...

Вот результат прогона через EXPLAIN:

Code
1
2
3
4
id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   PRIMARY <derived2>  ALL NULL    NULL    NULL    NULL    3277     
1   PRIMARY n   eq_ref  PRIMARY PRIMARY 4   g.id    1   Using where
2   DERIVED prs_5gramms range   code    code    4   NULL    17663   Using where; Using temporary
Никто не знает, как грамотно сделать выборку из двух таблиц (1:М) по общему ключу и по условию, что в индексном поле второй таблицы присутствует ХОТЯ БЫ одно значение из заданного набора?
Вопрос: Вывод результата в процессе выполнения запроса

Есть приложение: Spring, Spring Data JPA, Mysql.

Есть запрос который может выполнятся продолжительное время. В этом запросе происходит выборка с базы и фильтрация посредством Java (таково задание, не моя прихоть). То бишь я постранично достаю пачку данных с бд, фильтрую, иду за следующей пачкой данных.

Нюанс в том что бы увидеть результат запроса мне нужно ждать пока все не обработается.

Если ли возможность публиковать результат во время выполнения запроса? То бишь получил первую пачку данных, отфильтровал, отправил клиенту и т.д.

Структура обычная RestContoller->Service->JpaDao.
Ответ: Kachalov, условно если в таблице 100 000 000 записей то сколько мне нужно делать ajax запросов что бы получить все?
Вопрос: Скорость выполнение GLSL инструкций

Интересует два вопроса:

1. Как измерить скорость выполнения GLSL кода или отдельной команды аппаратными средствами типа каких то встроенных команд, чтобы узнать за сколько тактов/циклов они выполняются? Какие есть способы?

2. Где можно посмотреть данные о скоростях GLSL инструкций на разных gpu ?

Я нашел только это:
Ответ:
Вопрос: Найти количество счастливых билетов учитывая скорость выполнения программы

Найти количество счастливых билетов учитывая скорость выполнения программы,счастливый билет имеет вид a+b+c=d+e+f.
Ответ:
Сообщение от gogaloh
Выдает ответ 1000.
Как код напишешь - так он и считает...
Вопрос: Почему плавает скорость выполнения кода

Здравствуйте, заметил такое дело. Имеем часть кода
Где pg-это List<Page>(параметры страницы для сайта) состоит из 1000 строк.
s_Id-число по которому ищем соответствие в pg

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
System.Diagnostics.Stopwatch myStopwatch = new System.Diagnostics.Stopwatch();
myStopwatch.Start();
for (int i=0; i < 200000; i++)
{
Page ph = new Page();
                int l = 0;
                while (true)
                {
                    if (pg[l].Id == s_Id)
                    {
                        ph = pg[l];
                        break;
                    }
                    l++;
                }
}
myStopwatch.Stop(); //остановить
            TimeSpan ts = myStopwatch.Elapsed;
string time=ts.Milliseconds.ToString();
Так вот вопрос почему, при разных s_Id разная скорость выполнения? например у меня так выходит s_Id=600 time=950, а при s_Id=700 time=263 !!!!!
Ответ: Ответ дал LeniumSoft правильный, вопрос закрыт

Добавлено через 3 минуты
Сообщение от nimazzzy
Тогда он и должен только искать строку, а не создавать кучу левых ненужных для поиска объектов. Иначе, тестирование грязное.
Спасибо нажал вам по ошибке!, я просто не понял к чему вы вобще столько слов не потеме написали

Добавлено через 2 минуты
В приведенном примере поиск нужной строки оказался самым быстрым из мною опробованных способов, но возможно я еще про какие-то способы незнаю

Добавлено через 1 минуту
например
C#
1
var dd = pg.FirstOrDefault(n => n.Id == s_Id);
оказался в 2,5 раза медленней
Вопрос: SQLite Проверка на выполнение запроса

SQLite Проверка на выполнение запроса

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 //создание таблицы запрос таблицы command_SQL
        public int Sqlite_Create_Table(string command_SQL,SQLiteConnection sqliteconn)
        {
            int flagcreat = 0;
            try
            {
                //подключаемся
                SQLiteCommand command = new SQLiteCommand(sqliteconn);
                //передача запроса
                command.CommandText = command_SQL;
                //выполнение запроса
                command.CommandType = CommandType.Text;
                //получение ошибок
                flagcreat = command.ExecuteNonQuery();
                
            }
            catch 
            {
 
                flagcreat = 0;
            }
 
            return flagcreat;
        }
C#
1
2
3
4
5
6
SQLiteConnection sqliteconn;
string query="create table highscores (name varchar(20), score int)";
 
int error=Sqlite_Create_Table(query, sqliteconn);
 
MessageBox.Show(error.ToString());
возвращает 0
хотя все правильно , должно вернуть 1

Ну и как проверить на правильность запроса
это ExecuteScalar()
или что то другое ?
Ответ: Понял
Вопрос: Время выполнения запроса в MySQL

Добрый день.
Не могу понять причину длительного выполнения запроса. Есть таблица, которая содержит несколько миллионов записей. В phpmyadmin запускаю на выполнение запрос - выполняется за 10 секунд. Тот же самый запрос запускаю из программы стандартной командой mysql_query - выполняется за 570 секунд. Что только не делал, но никак подвижек. Все другие запросы в ПО исполняются как положено.

Это сообщение отредактировал Ballatus - 11.09.2015 - 19:29
Ответ: Проблему решил. Поднял MySQL на Slackware, залил дамп - все ок. "Старый" сервер был на Windows 2003. Спасибо за помощь.
Тема закрыта.
Вопрос: Время выполнения запроса

Работаю с MSSQL. Выполняю параметрический запрос. В 1-ый раз время выполнения запроса - 17 сек.
Выполняю тот же запрос во 2-ой раз. Время выполнения запроса - меньше сек.
Плиз, народ, подскажите, кто знает. В чем тут причина?
Ответ: Спасибо. Все верно. Есть только одна фишка. Нужно убедиться, что с первичным ключом все в порядке. Проще всего перестроить первичный ключ. У меня все нормально заработало только после этой операции.