Skip to content

Performance Optimization ​

Tips and techniques to maximize Diffyne performance.

Database Optimization ​

1. Limit Query Results ​

php
// Good
$this->items = Item::limit(50)->get();

// Avoid
$this->items = Item::all(); // Could be thousands

2. Eager Load Relationships ​

php
// Good
$this->posts = Post::with(['user', 'comments'])->get();

// Avoid - N+1 problem
$this->posts = Post::all();
// Then accessing $post->user in loop

3. Select Only Needed Columns ​

php
// Good
$this->users = User::select('id', 'name', 'email')->get();

// Avoid
$this->users = User::all(); // Loads all columns

4. Use Caching ​

php
use Illuminate\Support\Facades\Cache;

public function loadStats()
{
    $this->stats = Cache::remember('dashboard-stats', 60, function() {
        return [
            'users' => User::count(),
            'posts' => Post::count(),
            'revenue' => Order::sum('total'),
        ];
    });
}

Component Optimization ​

1. Use Deferred Binding ​

blade
{{-- Good - syncs once on submit --}}
<input diff:model.defer="name">

{{-- Avoid - syncs on every keystroke --}}
<input diff:model.live="name">

2. Add Debouncing ​

blade
{{-- Good - waits 300ms after typing stops --}}
<input diff:model.live.debounce.300="search">

{{-- Avoid - sends request on every keystroke --}}
<input diff:model.live="search">

3. Optimize Polling Intervals ​

blade
{{-- Good - reasonable interval --}}
<div diff:poll.5s="refresh">

{{-- Avoid - too frequent --}}
<div diff:poll.100ms="refresh">

4. Limit Component Size ​

php
// Good - focused component
class TodoList extends Component
{
    public array $todos = [];
    public function addTodo() { /* ... */ }
}

// Avoid - too many responsibilities
class Dashboard extends Component
{
    public array $todos, $users, $posts, $stats, $notifications;
    // 20+ methods...
}

State Optimization ​

1. Keep State Minimal ​

php
// Good
public int $userId;
public function hydrate()
{
    $this->user = User::find($this->userId);
}

// Avoid - serializing entire model
public User $user;

2. Use Computed Properties ​

php
// Good
public function getTotalPrice()
{
    return array_sum(array_column($this->items, 'price'));
}

// Avoid - storing computed value
public float $totalPrice;
public function updated()
{
    $this->totalPrice = array_sum(...);
}

3. Clean Up Temporary Data ​

php
public function dehydrate()
{
    unset($this->temporaryData);
    unset($this->largeObject);
}

Frontend Optimization ​

1. Minimize DOM Updates ​

The Virtual DOM handles this automatically, but you can help:

blade
{{-- Good - conditional rendering --}}
@if($showDetails)
    <div>...</div>
@endif

{{-- Avoid - always rendering hidden element --}}
<div class="{{ $showDetails ? '' : 'hidden' }}">...</div>

2. Use Keys for Lists ​

blade
@foreach($items as $item)
    <li key="{{ $item['id'] }}">{{ $item['name'] }}</li>
@endforeach

3. Lazy Load Images ​

blade
<img src="placeholder.jpg" data-src="{{ $image }}" loading="lazy">

Network Optimization ​

1. Batch Operations ​

php
// Good - single request
public function deleteSelected()
{
    Item::whereIn('id', $this->selectedIds)->delete();
}

// Avoid - multiple requests
foreach ($selectedIds as $id) {
    // Triggers separate request per item
}

2. Use Compression ​

Diffyne automatically minifies responses. Ensure gzip is enabled on your server.

3. CDN for Assets ​

Serve diffyne.js from CDN for better caching.

Benchmarking ​

Measure Component Performance ​

php
public function expensiveOperation()
{
    $start = microtime(true);
    
    // Your code here
    
    $time = microtime(true) - $start;
    logger("Operation took: " . $time . "s");
}

Monitor Database Queries ​

php
DB::enableQueryLog();

$this->loadData();

$queries = DB::getQueryLog();
logger("Queries executed: " . count($queries));

Production Checklist ​

  • [ ] Enable caching (DIFFYNE_CACHE=true)
  • [ ] Disable debug mode (DIFFYNE_DEBUG=false)
  • [ ] Optimize database queries
  • [ ] Add database indexes
  • [ ] Use deferred/debounced model binding
  • [ ] Limit query results
  • [ ] Eager load relationships
  • [ ] Enable gzip compression
  • [ ] Use CDN for static assets
  • [ ] Monitor with Laravel Telescope/Debugbar

Performance Comparison ​

Typical operation times:

OperationTime
Counter increment50-80ms
Form submission100-200ms
Search query150-300ms
List update80-150ms

Payload sizes:

OperationPayload
Counter increment~50 bytes
Todo add~150 bytes
Search results~500-2000 bytes

Next Steps ​

Released under the MIT License.