Как я уже писал в качестве комментария к первому сообщению:
Не связано с «производительностью: если присваивание», но одним из способов сделать текстовые данные намного меньшими является их сжатие (gzip / deflate)).Вы говорите, что большинство данных повторяются - это означает, что они будут иметь высокую степень сжатия.Сжатие может быть включено глобально в конфигурации сервера, т. Е. Вам не нужно менять свой сценарий для этого.
Сжатые «обработанные данные», вероятно, будут несколько меньше, чем «полные данные», хотя ясомневаюсь, что это может быть на 80% меньше.
Теперь о производительности.
Код:
$time = microtime(true);
$data = array();
for ( $n = 0; $n < 25000; ++$n ) {
$data[] = array('id' => $n, 'text' => 'foo bar', 'key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3');
$data[] = array('id' => $n, 'text' => 'foo bar', 'key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3');
$data[] = array('id' => $n, 'text' => 'foo bar', 'key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3');
$data[] = array('id' => $n, 'text' => 'foo bar', 'key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3');
$data[] = array('id' => $n, 'text' => 'foo bar', 'key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3');
}
printf("%.05f\n\n", microtime(true) - $time);
for ( $n = 0; $n < 10; ++$n ) {
$time = microtime(true);
$tmp = array();
foreach ( $data as $row ) {
$id = $row['id'];
$tmp[$id]['text'] = $row['text'];
$tmp[$id]['key1'] = $row['key1'];
$tmp[$id]['key2'] = $row['key2'];
$tmp[$id]['key3'] = $row['key3'];
}
printf("%.05f\n", microtime(true) - $time);
}
echo "\n";
for ( $n = 0; $n < 10; ++$n ) {
$time = microtime(true);
$tmp = array();
$id = null;
foreach ( $data as $row ) {
if ( $row['id'] !== $id ) {
$id = $row['id'];
$tmp[$id]['text'] = $row['text'];
$tmp[$id]['key1'] = $row['key1'];
$tmp[$id]['key2'] = $row['key2'];
$tmp[$id]['key3'] = $row['key3'];
}
}
printf("%.05f\n", microtime(true) - $time);
}
echo "\n";
for ( $n = 0; $n < 10; ++$n ) {
$time = microtime(true);
$tmp = array();
foreach ( $data as $row ) {
if ( !isset($tmp[$row['id']]) ) {
$id = $row['id'];
$tmp[$id]['text'] = $row['text'];
$tmp[$id]['key1'] = $row['key1'];
$tmp[$id]['key2'] = $row['key2'];
$tmp[$id]['key3'] = $row['key3'];
}
}
printf("%.05f\n", microtime(true) - $time);
}
echo "\n";
Результаты:
0.26685; 0.32710; 0.30996; 0.31132; 0.31148; 0.31072; 0.31036; 0.31082; 0.30957; 0.30952;
0.21155; 0.21114; 0.21132; 0.21119; 0.21042; 0.21128; 0.21176; 0.21075; 0.21139; 0.21703;
0.21596; 0.21576; 0.21728; 0.21720; 0.21610; 0.21586; 0.21635; 0.22057; 0.21635; 0.21888;
Яне знаю почему, но первый тайминг первого теста постоянно меньше, чем другие тайминги для того же теста (0,26-0,27 против 0,31-0,32).Кроме этого, мне кажется, стоит проверить, существует ли уже строка.