//~ Success, iterations = 50000, nobj = 100000
//~
//~ real	0m0.818s
//~ user	0m0.290s
//~ sys	0m0.520s

//~ при увеличении с 50000 до 60000 std::string лезут в своп, дождаться завершения не получится,
//~ в то время как realloc(), xrealloc() и zrealloc() спокойно работают при кратном увеличении nobj.
//~ во всех тестах zrealloc показала наилучшие результаты :), приблизительно в 1.5 раза быстрее xrealloc() и realloc().
//~ std::string не у дел :(

// при сильной накрузке и использовании swap std::string в разы проигрывает из-за дефрагментации

#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <vector>
#include <string>

int main(int argc, char *argv[])
{
	if (argc != 3) {
		fputs("Usage: realloc_speed_test_cpp iterations nobj\n", stderr);
		exit(-1);
	}

	size_t iterations = (size_t)atoi(argv[1]);
	size_t nobj = (size_t)atoi(argv[2]);

	std::vector<std::string> v(nobj);

	//std::string app; for(size_t k=0; k<1000; k++) app += ' ';

	size_t i, j, idx;
	for (i = 0; i < iterations; i++) {
		idx = (size_t)(rand() % (int)nobj);
		try {
			//v[idx] += v[idx];//app;
			//v[idx].resize(i);
			for (j = 0; j < i; j++)
				v[idx] += ' ';
		} catch(...) {
			fprintf(stderr, "Alloc error at i = %lu\n", i);
			exit(-1);
		}
	}

	printf("Success, iterations = %lu, nobj = %lu\n", iterations, nobj);

	return EXIT_SUCCESS;
}