Последние несколько месяцев я работал над проектом Visual C ++, чтобы получать изображения с камер и обрабатывать их.До сегодняшнего дня это занимало около 65 мс для обновления данных, но теперь оно внезапно значительно увеличилось.Происходит следующее: я запускаю свою программу и в течение примерно 30 итераций она работает, как и ожидалось, затем внезапно время цикла увеличивается с 65 мс до 250 мс.
Странно то, что после синхронизации каждой функции Iобнаружил, что часть кода, которая вызывает замедление, является довольно простой и не изменялась более месяца.Данные, поступающие в него, остаются неизменными и идентичны на каждой итерации, но время выполнения, которое первоначально составляет менее 1 мс, внезапно увеличивается до 170 мс, в то время как остальная часть кода все еще работает как ожидалось (по времени).
По сути, я вызываю одну и ту же функцию снова и снова, потому что первые 30 вызовов она выполняет должным образом, после чего она замедляется без видимой причины.Также стоит отметить, что это внезапное изменение времени выполнения, а не постепенное увеличение.
Что может быть причиной этого?В коде происходит утечка памяти (~ 50 кбит / с), но этого недостаточно, чтобы обеспечить внезапное 4-кратное замедление.Если у кого-нибудь есть идеи, я бы с удовольствием их услышал!
Редактировать: Вау, это было быстро!Вот код (без математики), который замедляется.Я знаю, что это функция, где вычислительное время будет быстро увеличиваться, если вы увеличите количество строк.Ключевым моментом здесь является то, что с теми же данными это замедляется после 30 итераций.
void CameraManager::IntersectLines()
{
// Two custom classes
TMaths maths;
TLine line1, line2;
while(lines.size()>0)
{
// Save the current line
line1 = lines[0];
// Then remove it from the list
lines.erase(lines.begin());
CvMat* aPoint;
for (int i = 0; i<lines.size(); i++)
{
line2 = lines[i];
aPoint = cvCreateMat(1, 4, CV_32FC1);
// Calculate the point of intersection
maths.Intersect(line1.xyz, line2.xyz, line1.uvw, line2.uvw, aPoint);
// Add the point to the list
points.push_back(aPoint);
}
}
}
}