@valera213123
это я

С++ Vs js производительность, у js немного больше вот функции для теста, я думал разница будет в 2 раза а не в 3секунды, код функций внизу?

вот функция js
function determinant(m) {
      if (m.length===1) {
        return m[0][0];
      }
      if (m.length===2) {
        return (m[0][0]*m[1][1]) - (m[0][1]*m[1][0]);
      } else {
        let BigArr = [];
        for (let t=0; t<m[0].length; t++) {
          let smallArr = [];
          for(let r=1; r<m.length; r++) {
            let arr = [];
            for(let e=0; e<m[0].length; e++) {
              if (e!=t) {
                arr.push(m[r][e]);
              }
            }
            smallArr.push(arr);
          }
          BigArr.push(determinant(smallArr));
        }
        let tmp = true;
        let current = 0;
        for (let t=0; t<m.length; t++) {
          (tmp) ? current+=m[0][t]*BigArr[t] : current-=m[0][t]*BigArr[t];
          tmp=!tmp;
        }
        return current;
      }
    };
    let data = new Date();
    let num = 11;
    let arr = [];
    for (let t=0; t<num; t++) {
      arr.push([]);
      for (let r=0; r<num; r++ ) {
        arr[t][r] = Math.random()*100;
      }
    }
    console.log(determinant(arr));
    let d = new Date();
    console.log(d - data);


вот с++

// 1.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
//

#include <iostream>
#include <ctime>
using namespace std;

/*
function determinant(m) {
	  if (m.length===1) {
		return m[0][0];
	  }
	  if (m.length===2) {
		return (m[0][0]*m[1][1]) - (m[0][1]*m[1][0]);
	  } else {
		let BigArr = [];
		for (let t=0; t<m[0].length; t++) {
		  let smallArr = [];
		  for(let r=1; r<m.length; r++) {------------------------------
			let arr = [];
			for(let e=0; e<m[0].length; e++) {
			  if (e!=t) {
				arr.push(m[r][e]);
			  }
			}
			smallArr.push(arr);
		  }
		  BigArr.push(determinant(smallArr));
		}
		let tmp = true;
		let current = 0;
		for (let t=0; t<m.length; t++) {
		  (tmp) ? current+=m[0][t]*BigArr[t] : current-=m[0][t]*BigArr[t];
		  tmp=!tmp;
		}
		return current;
	  }
	};
*/
int determinant(int** m,const int length) {
	if (length == 1) {
		return m[0][0];
	}
	if (length == 2) {
		return (m[0][0] * m[1][1]) - (m[0][1] * m[1][0]);
	}
	else {
		int* BigM = new int[length];
		int BigLength = 0;
		for (int t = 0; t < length; t++) {
			int** Buf = new int* [length];
			for (int i = 0; i < length - 1; i++) {
				Buf[i] = new int[length - 1];
			}
			// массив создан
			int bufLength = 0;
			for (int i = 1; i < length; i++) {
				int shet = 0;
				for (int w = 0; w < length; w++) {
					if (w!=t) {
						Buf[bufLength][shet] = m[i][w];
						shet++;
					}
				}
				bufLength++;	
			}
			BigM[BigLength] = determinant(Buf, length - 1);
			BigLength++;
			for (int count = 0; count < length-1; count++)
				delete []Buf[count];
			delete[]Buf;
		}
		bool tmp = true;
		int current = 0;
		for (int t = 0; t < length; t++) {
			(tmp) ? current += m[0][t] * BigM[t] : current -= m[0][t] * BigM[t];
			tmp = !tmp;
		}
		delete[] BigM;
		return current;
	}
}

int** CoutArr(int** Array,int size)
{
	for (int i = 0; i < size; i++) {
		for (int r = 0; r < size; r++) {
			cout << Array[i][r] << "\t";
		}
		cout << '\n';
	}
	return Array;
}

int main()
{	
	/*
	[[2,4,2],[3,1,1],[1,2,0]]
	*/
	setlocale(LC_ALL,"Russian");
	const int size = 11;
	int start_time = clock(); // начальное время
	int arr[size][size];
	for (int t = 0; t < size; t++) {
		for (int r = 0; r < size; r++) {
			arr[t][r] = rand() % 100;
		}
	}
	int *p[size];
	for (int i = 0; i < size; i++) {
		p[i] = arr[i];
	}
	CoutArr(p,size);
	long long d = determinant(p, size);
	cout << "\n" << d;
	int end_time = clock(); // конечное время
	int search_time = end_time - start_time;
	cout << "\n\n" << search_time << "сек";
}

// Запуск программы: CTRL+F5 или меню "Отладка" > "Запуск без отладки"
// Отладка программы: F5 или меню "Отладка" > "Запустить отладку"

// Советы по началу работы 
//   1. В окне обозревателя решений можно добавлять файлы и управлять ими.
//   2. В окне Team Explorer можно подключиться к системе управления версиями.
//   3. В окне "Выходные данные" можно просматривать выходные данные сборки и другие сообщения.
//   4. В окне "Список ошибок" можно просматривать ошибки.
//   5. Последовательно выберите пункты меню "Проект" > "Добавить новый элемент", чтобы создать файлы кода, или "Проект" > "Добавить существующий элемент", чтобы добавить в проект существующие файлы кода.
//   6. Чтобы снова открыть этот проект позже, выберите пункты меню "Файл" > "Открыть" > "Проект" и выберите SLN-файл.


собственно где разница в 2 раза???
  • Вопрос задан
  • 86 просмотров
Решения вопроса 1
@res2001
Developer, ex-admin
1.Задайте size в миллион (или больше) и сравнивайте, ваши 11 сейчас - это вообще ни о чем для современных процов.
2.В коде на С++ не нужно выделять память для Buf так как это делаете вы - выделяйте одним куском сразу. Можно использовать std::vector.
3.В determinant() в последнем цикле избавьтесь от проверки условия внутри цикла. Возможно надо разбить этот цикл на 2.
Это то что сходу заметил.

На счет оптимизаций и прочего - можно не особо заморачиваться код на плюсах будет гораздо в любом случае на больших объемах данных. Просто на текущих объемах вы не можете даже адекватно замерить время, т.к. задача выполняется практически мгновенно не зависимо от ЯП, в этом случае затраты времени, например, на запуск программы начинают играть существенную роль.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Adamos
@Adamos
C++ сам по себе не панацея. Его надо уметь готовить.
Разница в 2 раза вполне реальна, просто не надо думать, что ее даст тупое переписывание тех же самых операторов.
С++ просто дает возможность низкоуровневой оптимизации там, где в других языках она невозможна.
Например, ваши new-delete в цикле жрут немало времени, но без них можно обойтись.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы