Код: Выделить всё
var cluster = await Cluster.ConnectAsync("127.0.0.1", "Admin", "*****");
var bucket = await cluster.BucketAsync("Embedding");
var scope = await bucket.ScopeAsync("Testing");
var collection = await scope.CollectionAsync("Testing");
int i = 0;
Stopwatch stopwatch = Stopwatch.StartNew();
while (i < 10000)
{
string Id = "my-document-" + i;
var input = new { Name = "Ted", Number = i };
collection.UpsertAsync(Id,input);
i++;
}
stopwatch.Stop();
Console.WriteLine($"Complete in {stopwatch.ElapsedMilliseconds / 1000.00} seconds");
< /code>
Так что это просто подчеркивает 10000 документов этой простой формы. Я не могу поверить, что он выполняет всего около 150 документов в секунду. Мой товарищ по команде сказал, что это совершенно неприемлемо, он написал код Java, используя официальный SDK Couchbase, и это потребовалось всего 300 мс в документах с Uperting 10000.docker run -d --name db -p 8091-8096:8091-8096 -p 11210-11211:11210-11211 couchbase
< /code>
И это предлагается официальным веб -сайтом Couchbase, я не вытаскиваю из какого -то странного источника. Я использую процессор I5-8250U вместе с 12,0 ГБ оперативной памяти. Я думаю, что это слишком достаточное для подъема этих простых документов. Что связано с тем, что, когда мой товарищ по команде удалил асинхронную версию в своем коде Java, потребовалось 4 секунды, чтобы завершить это, поэтому я теперь подозреваю, что ряд в C# может не вести себя как асинхронное задание. Вопросы:
Хотя мой старый ноутбук (i5-8250U, 12,0 ГБ оперативной памяти) отличается, чем новый (i5-1135G7, 32,0 ГБ ОЗУ), так что скорость документов может отличаться как 150/1 и 10000/6s? Upsertasync в c# действительно асинхронно? Его скорость ведет себя очень похоже на несинхродический подъем в Java, как и то, что показал мне мой товарищ по команде.package com.ecom.demo.couchbase;
import com.couchbase.client.java.*;
import com.couchbase.client.java.kv.*;
import com.couchbase.client.java.json.*;
import com.couchbase.client.java.query.*;
import reactor.core.publisher.Mono;
import java.time.Duration;
import java.util.List;
import java.util.stream.IntStream;
public class StartUsing {
instance and credentials.
static String connectionString = "couchbase://192.168.11.11";
static String username = "Administrator";
static String password = "*****";
static String bucketName = "*****";
public static void main(String... args) throws InterruptedException {
Cluster cluster = Cluster.connect(
connectionString,
ClusterOptions.clusterOptions(username, password).environment(env -> {
})
);
Bucket bucket = cluster.bucket(bucketName);
bucket.waitUntilReady(Duration.ofSeconds(10));
Scope scope = bucket.scope("test");
Collection collection = scope.collection("data");
ReactiveCollection reactiveCollection = collection.reactive();
System.out.println("connected");
int count = 10_000;
sync(count, collection);
//async(count, reactiveCollection);
}
static void sync(int count, Collection collection) {
long start = System.currentTimeMillis();
for (int i=1; i {
String id = "my-document-" + i;
JsonObject doc = JsonObject.create()
.put("name", "mike")
.put("age", i);
return reactiveCollection.upsert(id, doc)
.doOnError(error -> System.err.println("Upsert failed: " + error));
})
.toList();
Mono.when(upsertTasks)
.doOnTerminate(() -> {
long end = System.currentTimeMillis();
System.out.println("Total time (ms): " + (end - start));
})
.block();
long end = System.currentTimeMillis();
System.out.println(end - start);
}
}
< /code>
Тест на скорость на моем новом ноутбуке (32 ГБ один), используя секундомер, как в коде C#: < /p>
1 document = 0.022 seconds,
10 documents = 0.03 seconds,
100 documents = 0.074 seconds,
1000 documents = 0.412 seconds,
10000 documents = 5.713 seconds,
100000 documents = 55.072 seconds
< /code>
Ниже я тестирую на своем ноутбуке 32 ГБ с Java: < /p>
package com.ecom.demo.couchbase;
import com.couchbase.client.java.*;
import com.couchbase.client.java.kv.*;
import com.couchbase.client.java.json.*;
import com.couchbase.client.java.query.*;
import reactor.core.publisher.Mono;
import java.time.Duration;
import java.util.List;
import java.util.stream.IntStream;
public class StartUsing {
static String connectionString = "127.0.0.1";
static String username = "Administrator";
static String password = "*****";
static String bucketName = "Embedding";
public static void main(String... args) throws InterruptedException {
Cluster cluster = Cluster.connect(
connectionString,
ClusterOptions.clusterOptions(username, password).environment(env -> {
})
);
Bucket bucket = cluster.bucket(bucketName);
bucket.waitUntilReady(Duration.ofSeconds(10));
// get a user-defined collection reference
Scope scope = bucket.scope("Testing");
Collection collection = scope.collection("Testing");
ReactiveCollection reactiveCollection = collection.reactive();
System.out.println("connected");
int count = 10_000;
sync(count, collection);
//async(count, reactiveCollection);
}
static void sync(int count, Collection collection) {
long start = System.currentTimeMillis();
for (int i=1; i {
String id = "my-document-" + i;
JsonObject doc = JsonObject.create()
.put("Name", "Ted")
.put("Number", i);
return reactiveCollection.upsert(id, doc)
.doOnError(error -> System.err.println("Upsert failed: " + error));
})
.toList();
Mono.when(upsertTasks)
.doOnTerminate(() -> {
long end = System.currentTimeMillis();
System.out.println("Total time (ms): " + (end - start));
})
.block();
long end = System.currentTimeMillis();
System.out.println(end - start);
}
}
Код: Выделить всё
Stopwatch stopwatch = Stopwatch.StartNew();
int i = 0;
var tasks = new Task[10000];
while (i < 10000)
{
string Id = "my-document-" + i;
var input = new { Name = "Ted", Number = i };
tasks[i] = collection.UpsertAsync(Id, input);
i++;
}
Task.WaitAll(tasks);
stopwatch.Stop();
Подробнее здесь: https://stackoverflow.com/questions/794 ... ynchronous