summaryrefslogtreecommitdiff
path: root/internal/cpu/algorithms.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/cpu/algorithms.go')
-rw-r--r--internal/cpu/algorithms.go206
1 files changed, 206 insertions, 0 deletions
diff --git a/internal/cpu/algorithms.go b/internal/cpu/algorithms.go
new file mode 100644
index 0000000..2dd3fe4
--- /dev/null
+++ b/internal/cpu/algorithms.go
@@ -0,0 +1,206 @@
+// Package cpu provides CPU stress testing with multiple algorithms and chaos modes.
+package cpu
+
+import (
+ "context"
+ "crypto/md5"
+ "crypto/sha256"
+ "math"
+ "sort"
+)
+
+// algorithms.go implements all CPU stress algorithms (prime, matrix, hash, etc.).
+
+func (s *Stresser) stressPrime(ctx context.Context, n int) {
+ count := 0
+ for i := 2; count < n; i++ {
+ select {
+ case <-ctx.Done():
+ return
+ default:
+ }
+ if isPrime(i) {
+ count++
+ }
+ }
+}
+
+func isPrime(n int) bool {
+ if n < 2 {
+ return false
+ }
+ for i := 2; i*i <= n; i++ {
+ if n%i == 0 {
+ return false
+ }
+ }
+ return true
+}
+
+func (s *Stresser) stressMatrix(ctx context.Context, size int) {
+ if size < 10 {
+ size = 10
+ }
+ if size > 200 {
+ size = 200
+ }
+
+ a := make([][]float64, size)
+ b := make([][]float64, size)
+ for i := range a {
+ a[i] = make([]float64, size)
+ b[i] = make([]float64, size)
+ for j := range a[i] {
+ a[i][j] = float64(i+j) * 0.5
+ b[i][j] = float64(i*j) * 0.3
+ }
+ }
+
+ c := make([][]float64, size)
+ for i := range c {
+ c[i] = make([]float64, size)
+ for j := range c[i] {
+ select {
+ case <-ctx.Done():
+ return
+ default:
+ }
+ sum := 0.0
+ for k := 0; k < size; k++ {
+ sum += a[i][k] * b[k][j]
+ }
+ c[i][j] = sum
+ }
+ }
+}
+
+func (s *Stresser) stressHash(ctx context.Context, iterations int) {
+ data := make([]byte, 1024)
+ for i := range data {
+ data[i] = byte(i % 256)
+ }
+
+ for i := 0; i < iterations; i++ {
+ select {
+ case <-ctx.Done():
+ return
+ default:
+ }
+ sha256.Sum256(data)
+ md5.Sum(data)
+ }
+}
+
+func (s *Stresser) stressBitwise(ctx context.Context, iterations int) {
+ var result uint64 = 0
+ for i := 0; i < iterations*100; i++ {
+ select {
+ case <-ctx.Done():
+ return
+ default:
+ }
+ result ^= uint64(i) << (i % 64)
+ result |= result >> 3
+ result &= result << 7
+ result += result ^ 0x5555555555555555
+ result = (result << 13) | (result >> 51)
+ }
+ _ = result
+}
+
+func (s *Stresser) stressFloat(ctx context.Context, iterations int) {
+ x := 1.0
+ for i := 0; i < iterations*10; i++ {
+ select {
+ case <-ctx.Done():
+ return
+ default:
+ }
+ x = math.Sin(x) + math.Cos(x*0.5)
+ x = math.Sqrt(math.Abs(x)) + math.Exp(x*0.01)
+ x = math.Atan(x) + math.Log(math.Abs(x)+1)
+ }
+ _ = x
+}
+
+func (s *Stresser) stressRecurse(ctx context.Context, n int) {
+ if n > 35 {
+ n = 35
+ }
+ _ = fibonacci(n)
+}
+
+func fibonacci(n int) int {
+ if n <= 1 {
+ return n
+ }
+ return fibonacci(n-1) + fibonacci(n-2)
+}
+
+func (s *Stresser) stressCompress(ctx context.Context, iterations int) {
+ data := make([]byte, 1024)
+ for i := range data {
+ data[i] = byte((i * 7) % 256)
+ }
+
+ for i := 0; i < iterations; i++ {
+ select {
+ case <-ctx.Done():
+ return
+ default:
+ }
+ hash := md5.Sum(data)
+ data = append(data, hash[:]...)
+ if len(data) > 10240 {
+ data = data[:1024]
+ }
+ }
+}
+
+func (s *Stresser) stressEncrypt(ctx context.Context, iterations int) {
+ key := make([]byte, 32)
+ data := make([]byte, 256)
+ for i := range data {
+ data[i] = byte(i % 256)
+ }
+
+ for i := 0; i < iterations; i++ {
+ select {
+ case <-ctx.Done():
+ return
+ default:
+ }
+ hash := sha256.Sum256(append(key, data...))
+ data = hash[:]
+ }
+}
+
+func (s *Stresser) stressSort(ctx context.Context, size int) {
+ if size < 100 {
+ size = 100
+ }
+ if size > 10000 {
+ size = 10000
+ }
+
+ data := make([]int, size)
+ for i := range data {
+ data[i] = s.rand.Intn(1000000)
+ }
+
+ sort.Ints(data)
+}
+
+func (s *Stresser) stressBusy(ctx context.Context, iterations int) {
+ var sum int64 = 0
+ for i := 0; i < iterations*1000; i++ {
+ select {
+ case <-ctx.Done():
+ return
+ default:
+ }
+ sum += int64(i * i)
+ sum = sum % 1000000007
+ }
+ _ = sum
+}