public static Tuple <int[][], int[][]> GetDataAsync(int matrixSize, string apiUri) { int[][] AmatrixRow = new int[matrixSize][]; int[][] BmatrixCol = new int[matrixSize][]; // setup an async task list to loop thru completed requests List <Task> TaskList = new List <Task>(); // download all data at once for (int i = 0; i < matrixSize; i++) { // make requests to row and column data var getMatrixARowTask = InvestCloudAPI.GetAsync(apiUri + "numbers/A/row/", i, true); TaskList.Add(getMatrixARowTask); // matrix B are stored as columns because it makes the AxB multiply matrix easier var getMatrixBColTask = InvestCloudAPI.GetAsync(apiUri + "numbers/B/col/", i, false); TaskList.Add(getMatrixBColTask); } // wait for downloads to finish Task.WaitAll(TaskList.ToArray()); // loop thru tasks and store result in their respective matrices foreach (Task <Tuple <string, int, bool> > t in TaskList) { if (t.Result.Item3) { string resultMatrixARow = t.Result.Item1; DataResponse resultMatrixAResponse = JsonConvert.DeserializeObject <DataResponse>(resultMatrixARow); AmatrixRow[t.Result.Item2] = resultMatrixAResponse.value; } else { string resultMatrixBCol = t.Result.Item1; DataResponse resultMatrixBResponse = JsonConvert.DeserializeObject <DataResponse>(resultMatrixBCol); BmatrixCol[t.Result.Item2] = resultMatrixBResponse.value; } } return(new Tuple <int[][], int[][]>(AmatrixRow, BmatrixCol)); }
static void Main(string[] args) { System.Net.ServicePointManager.DefaultConnectionLimit = 200; int matrixSize = 1000; bool verbose = false; int[][] AmatrixRow; int[][] BmatrixCol; string apiUri = "https://recruitment-test.investcloud.com/api/"; var watchOverall = System.Diagnostics.Stopwatch.StartNew(); var watch = System.Diagnostics.Stopwatch.StartNew(); // set up initialization GET Request var JSONObj = InvestCloudAPI.Get(apiUri + "numbers/init/" + matrixSize); InitResponse initResponse = JsonConvert.DeserializeObject <InitResponse>(JSONObj); watch.Stop(); Console.WriteLine($"init value: {initResponse.value}"); Console.WriteLine($"init time: { watch.ElapsedMilliseconds} ms"); // get matrix data watch = System.Diagnostics.Stopwatch.StartNew(); var getDataAsync = GetDataAsync2(matrixSize, apiUri); AmatrixRow = getDataAsync.Item1; BmatrixCol = getDataAsync.Item2; if (verbose) { for (int i = 0; i < matrixSize; i++) { if (i == 0) { Console.WriteLine(); Console.Write("["); } for (int j = 0; j < matrixSize; j++) { Console.Write(AmatrixRow[i][j] + " "); } if (i == matrixSize - 1) { Console.Write("]"); } else { Console.WriteLine(); } } for (int i = 0; i < matrixSize; i++) { if (i == 0) { Console.WriteLine(); Console.Write("["); } for (int j = 0; j < matrixSize; j++) { Console.Write(BmatrixCol[j][i] + " "); } if (i == matrixSize - 1) { Console.Write("]"); } else { Console.WriteLine(); } } } watch.Stop(); Console.WriteLine($"download time: {watch.ElapsedMilliseconds} ms"); // perform multiplication watch = System.Diagnostics.Stopwatch.StartNew(); string AxB = MultiplyAndSerialize2(AmatrixRow, BmatrixCol, matrixSize); if (verbose) { Console.WriteLine(); Console.WriteLine($"AxBmatrix: {AxB}"); } // generate hash string md5 = CalculateMD5Hash(AxB); watch.Stop(); Console.WriteLine($"hash: {md5}"); Console.WriteLine($"multiplication and hash time: {watch.ElapsedMilliseconds} ms"); // validate response with server JSONObj = InvestCloudAPI.Post(apiUri + "numbers/validate", md5, "text/json;charset=utf-8"); ValidateResponse validateResponse = JsonConvert.DeserializeObject <ValidateResponse>(JSONObj); Console.WriteLine($"result: {validateResponse.value}"); watchOverall.Stop(); Console.WriteLine($"total time: {watchOverall.ElapsedMilliseconds} ms"); Console.WriteLine("press any key to exit"); Console.ReadLine(); }